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

时间:2012-09-08 20:47:11

标签: c arrays pointers struct malloc

之间有什么区别
struct mystruct *ptr = (struct test *)malloc(n*sizeof(struct test));

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

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

3 个答案:

答案 0 :(得分:18)

第一个分配一个struct数组,另一个分配一个指向struct的指针数组。在第一种情况下,您可以通过立即分配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);

答案 1 :(得分:2)

  

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

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

  

他们都工作正常

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

  

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

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

答案 2 :(得分:1)

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