char name[2]; // 僅 2 字節
scanf("%s", name); // 輸入 "ab" 寫入 'a','b',無空間存 '\0'
printf("%s\n", name); // 繼續讀取相鄰內存直到遇 \0,輸出亂碼
C 語言字符串以 \0 結尾。name[2] 只能存 1 個有效字符 + \0。輸入 "ab" 導致緩衝區溢出,\0 丟失,printf("%s") 越界讀取。
#define NAME_LEN 32
char name[NAME_LEN];
scanf("%31s", name); // 寬度限制防溢出
scanf 使用寬度限制 %31s,fgets 指定大小更安全。-Wformat-overflow (GCC) / /analyze (MSVC) 靜態檢測。