最近碰到一個很奇怪的問題,想想關了電腦也要再開機記錄下來
主要代碼如下:
int main() { char* key[2]; scanf("%s", &key[0]); scanf("%s", &key[1]); printf("%s \n", &key[0]); return 0; }
當輸入: 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個字節的情況,只有輸入的最後一個字符串能完整的輸出。