在C中初始化结构指针的2-D阵列



编译时使用-std=gnu99。假设我有一个这样的结构:

typedef struct Foo {
char *quux;
int baz;
} Foo;

我注意到,您可以在堆中初始化一个包含NULL值的结构的1D数组,如下所示:

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的可变长度呢?

  1. 首先,在以下行中出现错误:

    bar = malloc(sizeof(Foo) * length);
    

应该是

bar = malloc(sizeof(Foo*) * length);

因为您想要为Foo*分配足够的空间,这将表示您的数组的开始。原始行将为Foo分配空间。

  1. 如果您按照上面的样式分配2D数组,您将总共执行11个free((,每个分配的子数组一个(10(,分配的指针数组一个。即

    for (int i = 0; i < length; ++i) { free(bar[i]); } 
    free(bar);
    

最新更新