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

malloc of pointer to structure works why?

在我不小心使用的代码中

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

而不是正确的

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

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

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

这里的想法是,malloc() 不知道 (type/size) 或与将要分配 return 值的变量相关。它接受输入参数,分配请求大小的内存和 returns 指向内存块的指针,仅此而已。因此,如果您请求了错误大小的内存块,malloc() 不会阻止您这样做。使用 returned 指针后,您将成为

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

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


忠告:

为避免此类错误,请使用格式

  type * variable = malloc(sizeof *variable);

那样的话,你有两个优势,

  1. 您的语句与变量的类型无关。
  2. 错误输入所需尺寸的几率较小。