結構體大小非單純成員大小之和,受對齊規則影響:
struct BBB *p = (struct BBB *)0x100000; p + 1 // 0x100020 (跳過整個結構體 32 bytes) (unsigned long)p + 1 // 0x100001 (整數加 1) (unsigned long *)p + 1 // 0x100008 (按 unsigned long 8 bytes 遞增) (char *)p + 1 // 0x100001 (按 char 1 byte 遞增)
宣告 含義 可修改指針 可修改指向值 const int *p/int const *p指向常數的指針 是 否 int *const p常數指針 否 是 const int *const p指向常數的常數指針 否 否 口訣:
*左邊有const→ 值不可改;*右邊有const→ 指針不可改。5. 動態記憶體分配的經典錯誤與修正
錯誤代碼
三大錯誤
- 參數傳值而非傳址,函數內修改不影響外部指針。
p未指向有效記憶體,strcpy導致未定義行為。free釋放的是未分配的地址,且釋放後未置NULL。正確寫法
總結
這些「易錯點」實際上是 C 語言核心機制(記憶體模型、類型系統、指針語義)的直接體現。深入理解對齊規則、
const語義、參數傳遞機制,才能寫出健壯、可移植的系統級代碼。建議配合-Wall -Wextra -pedantic編譯,並善用valgrind、asan等工具檢測記憶體錯誤。