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

C 結構體陣列記憶體佈局:指標成員與柔性陣列的區別

     編輯:程式設計疑難解答

定義回顧

typedef struct { char str[10]; } SElemType; // 含固定陣列
typedef struct {
    SElemType *base;  // 指標
    SElemType *top;   // 指標
    int stacksize;
} SqStack;

SqStack Sq[10]; // 陣列

記憶體佈局解析

  1. SqStack 大小 = 指標(8) + 指標(8) + int(4) + 對齊填充(4) = 24 位元組 (64 位系統)。
  2. Sq[10] 連續佔用 240 位元組,每個元素的 base、top 為未初始化指標(棧上垃圾值),stacksize 同理。
  3. SElemType.str[10] 不存在於 Sq 陣列中,因為 SqStack 只有指標,沒有內嵌 SElemType 物件。指標指向的記憶體需另行 malloc。

正確初始化流程

for (int i = 0; i < 10; i++) {
    Sq[i].base = malloc(MAX * sizeof(SElemType));
    Sq[i].top = Sq[i].base;
    Sq[i].stacksize = MAX;
}
// 使用完畢
for (int i = 0; i < 10; i++) free(Sq[i].base);

對比:若改為內嵌陣列

typedef struct {
    SElemType data[100]; // 內嵌,編譯期定長
    int top;
    int stacksize;
} SqStack2;
// SqStack2 直接包含 100 * sizeof(SElemType) 位元組,無需 malloc

核心區別

特性指標成員內嵌陣列
大小固定否(執行期分配)是(編譯期常量)
彈性高(可動態調整容量)低
記憶體碎片可能無
複製語義淺拷貝需手動深拷貝預設逐位複製即可

理解「指標 ≠ 陣列」,記憶體圖像化思考,避免未初始化指標解引用崩潰。

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