char word1[8], word2[8];
scanf("%s", word1); // 輸入 "12345678"
scanf("%s", word2); // 輸入 "12345678"
printf("word1=%s##word2=%s\n", word1, word2);
// 輸出:word1=##word2=12345678
word1 內容消失,顯示為空字符串。
word1 在棧底(高地址),後定義的 word2 在棧頂(低地址)。word1 只有 8 字節(索引 0~7),需存 8 字符 + '\0' 共 9 字節 → 越界寫入 word2 的起始位置。word2 同樣越界寫入其下方內存,導致 word1 的結束符被覆蓋為 '1',word1 打印時遇不到 '\0' 而讀入 word2 的內容,但示例中因 word2 也滿 8 字符,其結束符寫入再下方,word1 變為無結束符的長串,但輸出顯示為空,實際可能是調試輸出截斷。printf("word1 addr=%p\n", word1);
for (i=0;i<8;i++) printf("word1[%d]=%c addr=%p\n", i, word1[i], &word1[i]);
// 可見 word1[8] (即 word2[0]) 被寫入 '1'
最大長度+1。scanf("%7s", word1) 限制讀取寬度,或改用 fgets。-fstack-protector)與地址消毒器(ASan)檢測越界。