malloc结构指针数组与结构数组

有什么区别

struct mystruct *ptr = (struct test *)malloc(n*sizeof(struct test)); 

 struct mystruct **ptr = (struct test *)malloc(n*sizeof(struct test *)); 

他们都工作正常,我只是好奇两者之间的实际差异。 第一个是否分配了一个结构数组,而第二个是结构指针数组? 另一种方式? 另外,哪一个占用内存较小?

第一个分配一个struct数组,另一个分配一个指向struct的指针数组。 在第一种情况下,您可以通过分配ptr[0].field1 = value;来写入字段ptr[0].field1 = value; 马上,在第二种情况下,你必须在做实际写作之前分配struct本身。

可以将malloc结果的转换放在C中,这样你就可以写了

 struct mystruct **ptr = malloc(n*sizeof(struct test *)); for (int i = 0; i != n ; i++) { ptr[i] = malloc(sizeof(struct test)); } ptr[0]->field1 = value; ... // Do not forget to free the memory when you are done: for (int i = 0; i != n ; i++) { free(ptr[i]); } free(ptr); 

我只是对这两者之间的实际差异感到好奇

函数malloc不处理结构或指针。 它只能理解字节 。 因此,第一个为n个struct test对象分配足够的字节,第二个为n个struct test *对象分配足够的空间。

他们都很好

事情看起来,2将用于完全不同的事情。 例如,在第二种情况下,您必须为每个ptr[i]元素分配内存。

此外,哪一个具有较小的内存占用

如果您打印sizeof(struct test)sizeof(struct test *) ,您可以自己回答。 但同样,它们是不同的东西, 具有不同的目的 。 哪个占地面积较小,拖拉机还是甲虫?

第一个分配结构数组。 第二个分配一个指向结构的指针数组(结构本身没有内存)。 所以第二个更小,除非你的结构当然也像指针一样小。