1 #include<stdio.h> 2 char *myString() 3 { 4 char buffer[6] = {0}; 5 char *s = "Hello World!"; 6 for (int i = 0; i < sizeof(buffer) - 1; i++) 7 { 8 buffer[i] = *(s + i); 9 } 10 return buffer; 11 } 12 int main(int argc, char **argv) 13 { 14 printf("%s\n", myString()); 15 return 0; 16 }
函數char *myString()中沒有使用new或者malloc分配內存,全部buffer數組的內存區域在棧區。隨着char *myString()的結束,棧區內存釋放,字符數組也就不存在了,因此會產生 野指針,輸出結果未知。
首先,這個現象只會在windows下用vs或者vc編程時纔出現, 而且只會出如今debug版本的運行過程當中。若是在類unix系統下,使用gcc或者clang編譯器,你獲得得一般會是提示 segmentation fault.vc或者vs在debug版本的程序初始化時,會將棧內未初始化的內存的每一個字節設置成 0xcc,這個表明的是一個 特殊的中斷機器碼,int 3,準確地說是 軟件調試中斷,利用這個中斷產生的異常,咱們能夠得到ring0級別的kernel權限。注意,這裏的int是interrupt的意思,不是integer。將這些內存初始化成這個樣子是爲了方便用戶進行斷點調試。然而,當你的程序訪問了未初始化的棧內存時,例如數組越界,就會獲得這個特殊字節。在你把它打印出來時,一般會進行ascii碼的映射。但是, 0xcc對應的十進制是 204,然而ascii碼的範圍是0~127啊!對此,對於一個超過ascii碼錶示範圍的字符,程序一般會嘗試使用 unicode編碼,unicode編碼是 16位的,因此0xcc會被擴展稱爲 0xcccc,咱們驗證一下「燙」的unicode編碼值: