關於函數返回值/打印語句爲忐或燙的問題

問題① 函數返回值爲「忐」
 
 
 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編碼值:
 
相關文章
相關標籤/搜索