首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C/C++ 指針與數組邊界:為什麼字符數組輸出超出定義長度?

     編輯:程式設計疑難解答

C/C++ 指針與數組邊界:為什麼字符數組輸出超出定義長度?

現象:定義 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。
  • 無邊界檢查:C/C++ 不會自動阻止緩衝區溢出,strcpy 會一直寫入直到遇到 \0。
  • 輸出函數不計長度:printf("%s") 從首地址開始讀取,直到遇到 \0,因此顯示「超長」內容。

危害

越界寫入會破壞相鄰變量、返回地址、函數幀,導致程式崩潰或安全漏洞(緩衝區溢出攻擊)。

安全替代方案

  1. 使用 strncpy 限制長度:
    strncpy(s2, src, sizeof(s2)-1);
    s2[sizeof(s2)-1] = '\0'; // 確保結束符
  2. C++ 推薦 std::string:
    std::string s2 = src; // 自動管理內存,無長度限制
  3. C++17 std::string_view 只讀場景。

調試技巧

  • 編啟用 -fstack-protector-strong (GCC/Clang) 或 /GS (MSVC) 檢測棧破壞。
  • 使用 AddressSanitizer (-fsanitize=address) 精確定位越界讀寫。
  • 代碼審查時,所有字符數組操作必須標註最大長度並檢查邊界。

牢記:指針只是地址,不帶長度信息。數組長度只在編譯期可見,運行時需程序員自行維護。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved