在c编程语言上为数据结构分配内存的不同方法

时间:2016-08-22 14:52:05

标签: c structure

在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;
}

没有编译错误。
但我感到困惑,那么它们之间有什么区别,哪一个应该是首选?

3 个答案:

答案 0 :(得分:2)

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

  2. 不是我最喜欢的方式 - 尽管它可以说是最具可读性 - 因为你可能会更改*ptr2的类型并忘记调整sizeof Element。这些错误是追踪的噩梦

  3. 太可怕了:在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