錯誤程式碼
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,再個別配置。
- 釋放順序:先釋放內層指標,再釋放外層結構體陣列。