我有两个结构。我正在尝试在另一个结构"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 Ogilvie和chux在评论中的患者笔记