程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> 關於C >> C語言利用字符串數組讀取字符串的誤區

C語言利用字符串數組讀取字符串的誤區

編輯:關於C

最近碰到一個很奇怪的問題,想想關了電腦也要再開機記錄下來

主要代碼如下:

int main()
{
    char* key[2];
    
    scanf("%s", &key[0]);
    scanf("%s", &key[1]);

    printf("%s   \n", &key[0]);
    return 0;
}

要從控制台中讀取輸入的字符串,定義了一個char*類型的數組,結果出問題了。

當輸入: whos who 輸出:whoswho

當輸入: wwwwww dddddd 輸出:wwwwdddddd


有多糾結我就不說了,和同學討論了好久得出結論(可能有誤)

char* 在C語言中占四個字節,因為定義的key是個數組,在聲明時為它分配一塊連續的內存,於是數組key的每個單元都被固定成四個字節

對於第一種情況,whos正好占了四個字節,最後的終結符(記得是\0)越界放到了key[1]裡,隨後被寫入key[1]內存地址的數據覆蓋掉了,於是系統不知道key[0]到什麼地方結束,一直往後讀,直到遇到了key[1]的終結符,所以把key[1]一塊輸出了。

對於第二種情況也類似,6個w放到4個字節裡放不下,只能存放前四個,後面兩個越界放到了key[1]裡,隨後被寫入key[1]內存地址的數據覆蓋掉了。雖然後面的6個d也超出了范圍,但是這個數組只有兩個長度的大小,key[i]只是記錄了首地址,並沒有記錄結束位置的地址,於是這6個d把為這個數組分配的8個字節內存的後面一部分內存給占用了,所以最後一個字符串完整的輸出了。


假設還是定義key的長度為2,但是只讀取了一個字符串,不管它長度多大,都能完整輸出,因為它越界的部分沒有被覆蓋掉。

因此,對於這種輸入的字符串大於4個字節的情況,只有輸入的最後一個字符串能完整的輸出。


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved