指向结构的指针malloc为什么?

时间:2017-10-23 06:31:26

标签: c pointers malloc structure sizeof

在我意外使用的代码中

    list* Head = malloc(sizeof(list*));

而不是正确的

    list* Head = malloc(sizeof(list));

创建一个新的list类型节点但以后工作得很好。

所以我的问题是为什么它能正常运作?

1 个答案:

答案 0 :(得分:11)

这里的想法是,malloc()不知道(类型/大小)或与要为其分配返回值的变量的关系。它接受输入参数,分配所请求大小的内存并返回指向内存块的指针,就是这样。因此,如果您要求错误的内存块大小,malloc()没有什么可以阻止您这样做。一旦你使用返回的指针,你将是

  • 浪费内存,当分配的大小超过目标类型所需时。
  • 通过访问超出范围的内存导致undefined behavior,当请求的大小小于目标类型所需的大小时。

现在,在任何一种情况下,您都可以看到正常工作。前者有点允许(虽然应该避免),但后者是严格禁止的。

建议:

要避免这些类型的错误,请使用格式

  type * variable = malloc(sizeof *variable);

在这种情况下,你有两个好处,

  1. 您的陈述与变量的类型分离。
  2. 错误填写所需尺寸的可能性较小。