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) 將輸入寫入野指針地址,觸發未定義行為(通常為段錯誤)。
c->string = malloc(MAX_LEN * sizeof(char));
if (c->string == NULL) { free(c); exit(1); }
struct container {
int number;
char string[100]; // 直接內嵌數組
};
malloc/calloc?free?編譯時加入 -fsanitize=address -g(GCC/Clang),運行時自動檢測堆緩衝區溢出、使用後釋放等內存錯誤,快速定位崩潰根因。
牢記「指針只是地址,數據需另覓空間」,養成分配前檢查、釋放後置 NULL 的良好習慣,從根源杜絕此類崩潰。