微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在C中初始化结构指针的二维数组

如何解决在C中初始化结构指针的二维数组

我在编译时正在使用-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的可变长度呢?

解决方法

  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);
    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。