首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> 關於C

C語言易錯知識點大全:結構體對齊、指針陷阱與動態記憶體

     編輯:關於C

1. 結構體記憶體佈局與對齊

結構體大小非單純成員大小之和,受對齊規則影響:

  • 結構體起始地址能被其最寬成員大小整除。
  • 每個成員相對起始位移能被自身大小整除(或編譯器指定對齊數)。
  • 總大小為最大對齊數的整數倍。

範例分析

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 遞增)

2. 巢狀結構體/聯合體大小計算

宣告含義可修改指針可修改指向值
const int *p / int const *p指向常數的指針是否
int *const p常數指針否是
const int *const p指向常數的常數指針否否

口訣:* 左邊有 const → 值不可改;* 右邊有 const → 指針不可改。

5. 動態記憶體分配的經典錯誤與修正

錯誤代碼


三大錯誤

  1. 參數傳值而非傳址,函數內修改不影響外部指針。
  2. p 未指向有效記憶體,strcpy 導致未定義行為。
  3. free 釋放的是未分配的地址,且釋放後未置 NULL。

正確寫法


總結

這些「易錯點」實際上是 C 語言核心機制(記憶體模型、類型系統、指針語義)的直接體現。深入理解對齊規則、const 語義、參數傳遞機制,才能寫出健壯、可移植的系統級代碼。建議配合 -Wall -Wextra -pedantic 編譯,並善用 valgrind、asan 等工具檢測記憶體錯誤。

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