指针到结构的c-malloc为什么有效



在一个代码中,我意外地使用了

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

而不是正确的

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

创建一个新的list类型的节点,但它后来运行得很好。

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

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

  • 当分配的大小大于目标类型所需的大小时,会浪费内存
  • 当请求的大小小于目标类型所需的大小时,通过访问超出绑定的内存导致未定义的行为

现在,无论在哪种情况下,您都可以看到它正常工作。前者在某种程度上是允许的(尽管应该避免),但后者是严格禁止的。


忠告:

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

type * variable = malloc(sizeof *variable);

在这种情况下,你有两个优势,

  1. 您的语句与变量的类型解耦
  2. 错误键入所需尺寸的可能性较小

相关内容

  • 没有找到相关文章