C,如何在另一个结构中为一个结构的数组分配正确的空间



我有两个结构。我正在尝试在另一个结构"struct nest"中生成一个"struct bird"数组。

在创建嵌套结构时,我很难为bird数组分配正确的空间。

下面是我的代码。

struct bird {
int value;
};
typedef struct bird bird;
struct nest {
int nb_birds;
bird * * birds;     //bird * = points to the bird struct, * birds = Array with size unknown
};
typedef struct nest nest;
nest * create_nest(int nb_birds) {
nest * n = (nest *) malloc(sizeof(nest));
n->nb_birds = nb_birds;
//This is where I am stuck
***n->birds = (bird *) malloc(sizeof(bird) * nb_birds);*** 

int i;
for(i = 0; i < nb_birds; i++)
n->birds[i]=NULL;
return n;
}

您想要将nb_birds指针数组分配给bird结构,因此要分配的大小为nb_birds * sizeof(bird *)

然后您想要存储指向这个数组的指针,所以强制转换应该是第一个元素的地址——bird *的地址,即bird **

因此,

n->birds = (bird **) malloc(sizeof(bird *) * nb_birds);

p.s.如果您想分配ptr所指向的N对象,您可以编写,或者至少可以将其视为

ptr = (typeof(ptr)) malloc(sizeof(*ptr) * N);

更新:

需要注意的是,malloc返回与任何指针类型兼容的void *指针,而无需显式强制转换。所以,引用的程序行可以和一样短

ptr = malloc(N * sizeof(*ptr));

一些程序员,尽管他们对void *属性有很好的了解,但在这种情况下强烈倾向于使用显式强制转换。我不是他们中的一员,但我认为这些演员是造型师的偏好(比如()代表sizeof操作员(。所以我在上面的代码中留下了选角,因为OP使用了它,我认为这是他的选择。

尽管如此(至少为了答案的完整性和更多的读者(,还是需要注意这样的演员阵容是不必要的过度的。.

感谢Paul Ogilviechux在评论中的患者笔记

相关内容

  • 没有找到相关文章

最新更新