在C编程语言中,我遇到了几种为数据结构分配内存的方法:
#include <stdio.h>
#include <stdlib.h>
typedef struct Element
{
int number;
struct Element *next;
}Element;
int main(int argc, char *argv[])
{
/* Method NO.1 */
Element *ptr1 = malloc(sizeof(*ptr1));
/* Method NO.2 */
Element *ptr2 = malloc(sizeof(Element));
/* Method NO.3 */
Element *ptr3 = (Element*) malloc (sizeof(Element));
return EXIT_SUCCESS;
}
没有编译错误。
但我感到困惑,那么它们之间有什么区别,哪一个应该是首选?
答案 0 :(得分:2)
在我看来,最好的方式是一个国家英里。请记住sizeof *ptr1
是编译时可评估的,因此,由于取消引用未初始化的指针,因此无法发生运行时崩溃。
不是我最喜欢的方式 - 尽管它可以说是最具可读性 - 因为你可能会更改*ptr2
的类型并忘记调整sizeof Element
。这些错误是追踪的噩梦。
太可怕了:在C中演员是不必要的,偶尔也会有害。请参阅Do I cast the result of malloc?。
答案 1 :(得分:1)
std::string s;
s.reserve(100);
#1
错误,您想要分配Element *ptr1 = malloc(sizeof(ptr1));
大小的空间,而不是指向Element
的指针大小,
更改为
Element
Element *ptr1 = malloc(sizeof(*ptr1));
您正在使用typedef(别名为#2
Element *ptr2 = malloc(sizeof(Element));
),这很好。
struct Element
看看Do I cast the result of malloc?
您也可以使用:
#3
Element *ptr3 = (Element*) malloc (sizeof(Element));
即使Element *ptr4 = malloc(sizeof(struct Element));
是typedefed。
答案 2 :(得分:1)
第一种方法是这样做的首选方法。它为sizeof(*ptr1)
字节分配空间,其中*ptr1
是有问题的结构。如果由于某种原因修改了此变量的类型,则上述分配仍然有效。
第二种方法是正确的,因为它为sizeof(Element)
字节分配空间,这是结构的大小。但是,这不是首选,因为如果ptr1
的类型由于某种原因而改变但上面的表达式没有改变,那么你将不会分配适当的空间量。
第三种方法不正确,因为you should not cast the return value of malloc
。