在 C 中初始化一个二维结构指针数组
initializing a 2-D array of structs pointers in C
我编译的时候用的是-std=gnu99
。假设我有这样的结构:
typedef struct Foo {
char *quux;
int baz;
} Foo;
我注意到您可以像这样在堆中使用 NULL 值初始化一维结构数组:
Foo* bar[10] = {[0 ... 9] = NULL};
但是我如何为堆上的二维数组执行此操作?这是我的尝试:
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* 分配足够的 space,这将表示你的数组的开始。原始行将为 Foo.
分配 space
如果你按照上面的方式分配二维数组,你总共需要执行 11 次 free(),一个分配给每个子数组(10 个),另一个分配给你分配的指针数组分配。即
for (int i = 0; i < length; ++i) { free(bar[i]); }
free(bar);
我编译的时候用的是-std=gnu99
。假设我有这样的结构:
typedef struct Foo {
char *quux;
int baz;
} Foo;
我注意到您可以像这样在堆中使用 NULL 值初始化一维结构数组:
Foo* bar[10] = {[0 ... 9] = NULL};
但是我如何为堆上的二维数组执行此操作?这是我的尝试:
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* 分配足够的 space,这将表示你的数组的开始。原始行将为 Foo.
分配 space如果你按照上面的方式分配二维数组,你总共需要执行 11 次 free(),一个分配给每个子数组(10 个),另一个分配给你分配的指针数组分配。即
for (int i = 0; i < length; ++i) { free(bar[i]); } free(bar);