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

C 語言結構體指針未分配內存導致運行崩潰的經典錯誤與修復

     編輯:程式設計綜合問答

錯誤代碼重現

struct container {
    int number;
    char *string;
};

int main() {
    struct container *c = malloc(sizeof(struct container));
    if (c == NULL) exit(1);
    scanf("%d", &c->number);
    scanf("%s", c->string);  // 崩潰點:string 未分配內存
    printf("%d:%s\n", c->number, c->string);
    free(c);
    return 0;
}

崩潰原因深度解析

malloc(sizeof(struct container)) 僅為結構體本身分配了內存(包含 int 與指針 char *),但指針指向的目標內存未分配。scanf("%s", c->string) 將輸入寫入野指針地址,觸發未定義行為(通常為段錯誤)。

修復方案

  1. 為字符串單獨分配內存:
    c->string = malloc(MAX_LEN * sizeof(char));
    if (c->string == NULL) { free(c); exit(1); }
    
  2. 使用定長數組替代指針(若最大長度可控):
    struct container {
        int number;
        char string[100];  // 直接內嵌數組
    };
    

內存管理檢查清單

  • ✅ 結構體指針成員是否已 malloc/calloc?
  • ✅ 使用完畢是否對應 free?
  • ✅ 是否檢查分配返回值非 NULL?
  • ✅ 避免釋放後繼續使用(懸空指針)?

調試技巧

編譯時加入 -fsanitize=address -g(GCC/Clang),運行時自動檢測堆緩衝區溢出、使用後釋放等內存錯誤,快速定位崩潰根因。

牢記「指針只是地址,數據需另覓空間」,養成分配前檢查、釋放後置 NULL 的良好習慣,從根源杜絕此類崩潰。

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