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

C語言結構體數組與結構體指標完全指南:聲明、初始化、動態分配與訪問

     編輯:關於C語言

結構體數組

聲明與遍歷

struct Rec { int x, y; };
struct Rec rs[10];

for (size_t i = 0; i < sizeof rs / sizeof rs[0]; i++) {
    rs[i].x = i;
    rs[i].y = i * 2;
}

靜態初始化

struct Rec {
    char name[12];
    short age;
} rs[3] = {
    {"AAA", 11},
    {"BBB", 22},
    {"CCC", 22}
};

結構體指標指向現有數組

struct Rec *p = rs;  // 指向首元素
printf("%s, %d\n", p->name, p->age);        // rs[0]
printf("%s, %d\n", (p+1)->name, (p+1)->age); // rs[1]

p+1 會按 sizeof(struct Rec) 跳躍,指向下一元素。

單個結構體動態分配

struct Rec { char name[12]; short age; };
struct Rec *p = malloc(sizeof(struct Rec));

strcpy(p->name, "ABC");  // 或 stpcpy
p->age = 99;

printf("%s, %d\n", p->name, p->age);
printf("%s, %d\n", (*p).name, (*p).age);  // 等價寫法

free(p);

多個結構體動態分配(連續內存 = 動態數組)

指標算術訪問

struct Rec { int x, y; } *p;
size_t count = 10;
p = malloc(sizeof(struct Rec) * count);

for (size_t i = 0; i < count; i++) {
    (p+i)->x = i;
    (p+i)->y = i * i;
}
for (size_t i = 0; i < count; i++)
    printf("%d, %d\n", (p+i)->x, (p+i)->y);

free(p);

數組下標訪問(更直觀,推薦)

for (size_t i = 0; i < count; i++) {
    p[i].x = i;
    p[i].y = i * i;
}
for (size_t i = 0; i < count; i++)
    printf("%d, %d\n", p[i].x, p[i].y);

p[i] 編譯器自動轉換為 *(p+i),語義完全等價,可讀性更強。

核心概念:連續結構體即動態數組

  • malloc(sizeof(Rec)*n) 分配連續 n 個 Rec 空間。
  • 此時 p 既是指向首元素的指標,也是動態數組的「句柄」。
  • 支援 p[i]、(p+i)-> 兩種訪問方式,推薦統一用下標。

內存佈局對比

形式內存位置大小確定性生命週期訪問方式
靜態數組 Rec a[10]棧/數據段編譯期固定作用域/程序a[i].mem
指向靜態數組 Rec *p=a同上同上同上p[i].mem
單個動態 malloc(sizeof(Rec))堆運行期決定手動 freep->mem
動態數組 malloc(sizeof(Rec)*n)堆運行期決定手動 freep[i].mem

常見錯誤與避坑

  1. 忘記檢查 malloc 返回值:分配失敗返回 NULL,解引用導致崩潰。
  2. 柔性數組成員(C99):struct { int len; char data[]; } 需 malloc(sizeof(Struct)+len),非固定大小數組。
  3. 結構體對齊導致 sizeof 大於成員和:動態分配時 sizeof(Rec) 已含填充,無需手動加填充。
  4. free 後繼續使用指標(懸空指標):free(p); p = NULL; 良好習慣。

總結

結構體數組提供固定大小、連續存儲的聚合;結構體指標配合 malloc 實現動態大小、堆上生命週期管理。動態分配的連續結構體本質即動態數組,統一使用下標訪問 p[i] 最清晰。掌握靜態/動態、單個/數組四種組合及其內存語義,是 C 語言數據結構實戰的核心基本功。

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