現象:定義 char s2[10],通過指針 char *p2 = s2 複製長字符串,輸出時顯示長度遠超 10。
char s2[10];
char *p2 = s2; // p2 指向 s2 首地址
strcpy(p2, "123456789012345"); // 複製 15 字符 + '\0',共 16 字節
printf("%s", s2); // 輸出完整字符串,但已越界寫入
p2 和 s2 指向同一塊內存,對 p2 的寫入直接修改 s2。strcpy 會一直寫入直到遇到 \0。printf("%s") 從首地址開始讀取,直到遇到 \0,因此顯示「超長」內容。越界寫入會破壞相鄰變量、返回地址、函數幀,導致程式崩潰或安全漏洞(緩衝區溢出攻擊)。
strncpy 限制長度:
strncpy(s2, src, sizeof(s2)-1);
s2[sizeof(s2)-1] = '\0'; // 確保結束符
std::string:
std::string s2 = src; // 自動管理內存,無長度限制
std::string_view 只讀場景。-fstack-protector-strong (GCC/Clang) 或 /GS (MSVC) 檢測棧破壞。-fsanitize=address) 精確定位越界讀寫。牢記:指針只是地址,不帶長度信息。數組長度只在編譯期可見,運行時需程序員自行維護。