11

有什么区别

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

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

他们都工作得很好,我只是对两者之间的实际区别感到好奇。第一个是否分配结构数组,而第二个分配结构指针数组?另一种方式?另外,哪个内存占用更小?

4

3 回答 3

20

第一个分配一个 的数组struct,另一个分配一个指向 的指针数组struct。在第一种情况下,您可以通过立即分配来写入字段ptr[0].field1 = value;,而在第二种情况下,您必须struct在进行实际写入之前分配自身。

可以在 C 中删除malloc结果的强制转换,因此您可以编写

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);
于 2012-09-08T20:50:23.310 回答
2

我只是好奇两者之间的实际区别

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

他们都工作正常

从外观上看,2 将用于截然不同的事物。例如,在第二种情况下,您必须为每个ptr[i]元素分配内存。

另外,哪个内存占用更小

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

于 2012-09-08T20:50:37.337 回答
1

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

于 2012-09-08T20:50:56.397 回答