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

C 語言結構體中陣列動態配置記憶體的正確寫法

     編輯:程式設計綜合問答

錯誤程式碼

struct A { int num[3]; };
struct A *a = calloc(3, sizeof(struct A));
for(i=0;i<3;i++)
    for(j=0;j<3;j++)
        a[i].num[j] = (int *)calloc(1, sizeof(int)); // 錯誤:num[j] 是 int,不能存指標
free(a[i].num[j]); // 編譯錯誤

修正版(若 num 確須存指標)

struct A { int *num[3]; }; // 改為指標陣列
struct A *a = calloc(3, sizeof(struct A));
for(i=0;i<3;i++) {
    for(j=0;j<3;j++) {
        int *ptr = calloc(1, sizeof(int));
        a[i].num[j] = ptr; // 存指標
    }
}
for(i=0;i<3;i++) {
    for(j=0;j<3;j++) {
        free(a[i].num[j]); // 釋放各指標
    }
}
free(a);

若只需動態決定陣列大小

struct A { int *num; int size; };
struct A *a = calloc(3, sizeof(struct A));
for(i=0;i<3;i++) {
    a[i].size = 3;
    a[i].num = calloc(a[i].size, sizeof(int)); // 連續空間
    for(j=0;j

關鍵點

  • 結構體成員若為固定大小陣列 int num[3],隨結構體一起配置,**無法單獨 malloc/free 該陣列**。
  • 需動態大小或單獨管理時,成員應宣告為指標 int *num,再個別配置。
  • 釋放順序:先釋放內層指標,再釋放外層結構體陣列。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved