问题描述
我在编译时正在使用-std=gnu99
。假设我有一个这样的结构:
typedef struct Foo {
char *quux;
int baz;
} Foo;
我注意到您可以像这样在堆中使用NULL值初始化一维结构数组:
Foo* bar[10] = {[0 ... 9] = NULL};
但是我该如何对堆上的2D数组执行此操作?这是我的尝试:
int depth = 10;
int length = 10;
Foo **bar;
bar = malloc(sizeof(Foo) * length);
for (int i = 0; i < length; i++) {
bar[i] = (Foo*) calloc(depth,sizeof(Foo));
}
当我要释放此内存时,我会free()
10次还是100次?那么foo.quux的可变长度呢?
解决方法
-
首先,以下行出现错误:
bar = malloc(sizeof(Foo) * length);
应该是
bar = malloc(sizeof(Foo*) * length);
由于要为Foo *分配足够的空间,这将表示数组的开始。原始行将为Foo分配空间。
-
如果以上述方式分配2D数组,则总共要执行11个free(),对分配的每个子数组(10)进行一次,对分配的指针数组进行一次。即
for (int i = 0; i < length; ++i) { free(bar[i]); } free(bar);