2016-08-22 84 views
1

在C编程语言分配内存的数据结构,我曾经遇到过多种方式为数据结构分配内存:不同的方式对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

和这里的**分配有什么不同? – Olaf

回答

2
  1. 最好的方式,在我看来,一个国家英里。请记住,sizeof *ptr1是可编译时可评估的,因此不会由于取消引用未初始化的指针而导致运行时崩溃。

  2. 不是我喜欢的方式 - 尽管它可以说是最可读的 - 因为你可能改变*ptr2类型和忘记调整sizeof Element。而那些类型的错误是噩梦追查。太可怕了:在C中演员阵容是不必要的,甚至偶尔也会有害。请参阅Do I cast the result of malloc?

+0

对于第二种方法,你说我们可能会改变'* ptr2'的类型,忘记调整'sizeof Element',你能举个例子吗? – cheater

+0

当然,你发明了一个名为'ElementEx'的新结构(它大于'Element'),并保留了'ElementEx * ptr2 = malloc(sizeof(Element));'最终你的计算机将会融化。 – Bathsheba

+0

是的,你说得对,用第一种方法,我们总是可以分配结构所需的确切内存。所以我会更喜欢第一种方法。 – cheater

1
#1 

Element *ptr1 = malloc(sizeof(ptr1));是错误的,你想用Element的大小分配空间,不与指针的大小到Element

更改为

Element *ptr1 = malloc(sizeof(*ptr1)); 

#2 

Element *ptr2 = malloc(sizeof(Element)); 

您正在使用typedef(别名struct Element), 没关系。


#3 

Element *ptr3 = (Element*) malloc (sizeof(Element)); 

看看到Do I cast the result of malloc?


您还可以使用:

Element *ptr4 = malloc(sizeof(struct Element)); 

即使struct Element是通过typedef。

+0

我错过了*,实际上,对不起。 – cheater

1

第一种方法是这样做的首选方法。它为sizeof(*ptr1)字节分配空间,其中*ptr1是有问题的结构。如果由于某种原因该变量的类型被修改,上述分配仍然有效。

第二种方法是正确的,因为它为sizeof(Element)字节分配空间,这是结构的大小。但这并不是首选,因为如果由于某种原因ptr1的类型发生了更改,但上述表达式不是,则不会分配适当的空间量。

第三种方法不正确,因为you should not cast the return value of malloc

+0

是的,我改变了标题,thx。 – cheater

+0

第一种方法似乎在做'sizeof(* ptr1)',而不是'sizeof(ptr1)',所以它是正确的。 –

+2

@OliverCharlesworth OP最初有'sizeof(ptr1)',然后在我发布后进行编辑。我会更新以反映。 – dbush