有這樣一道題:
#include "stdio.h" int main() { char word1[8]; char word2[8]; scanf("%s", word1); scanf("%s", word2); printf("word1=%s##word2=%s\n", word1, word2); return 0; }
運行代碼,輸入:
12345678 12345678
後,為什麼輸出的是:
word1=##word2=12345678
word1哪去了。
由於c語言局部簡單變量是存在棧中,棧是先進後出的,所以先定義的變量在棧底。那麼輸入了word1後,內存中變量是下面這樣的:
我們可以看到,B8已經超出了word1定義的字符數組的范圍。
當word2輸入後,內存中變量變成了這樣的:
由於只給了A8到AF共8個地址空間(由於最後一位要放字符串結束標志\0,所以實際只能用A8到AE),但輸入了8個字符,所以導致字符串結束標志寫入到了下一塊內存地址(也就是B0中)。
#include "stdio.h" int main() { char word1[8]; char word2[8]; scanf("%s", word1); scanf("%s", word2); int count = 8; int i; printf("\nword1 begin addr = %p\n", word1); for(i=0;i<count;i++) { printf("word1[%d]=%c addr=%p\n", i, word1[i], &word1[i]); } printf("\n-------------------------------\n"); printf("word2 begin addr = %p\n", word2); for(i=0;i<count;i++) { printf("word2[%d]=%c addr=%p\n", i, word2[i], &word2[i]); } printf("\n-------------------------------\n"); printf("word1=%s##word2=%s\n", word1, word2); printf("0x0028FEB8=%c\n", *(int*)0x0028FEB8); return 0; }
運行效果: