有這樣一道題:
#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; }
運行效果:
