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

muh*_*aib -1 c malloc pointers structure sizeof

在我不小心使用的代码中

    list* Head = malloc(sizeof(list*));
Run Code Online (Sandbox Code Playgroud)

而不是正确的

    list* Head = malloc(sizeof(list));
Run Code Online (Sandbox Code Playgroud)

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

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

Sou*_*osh 11

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

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

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


忠告:

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

  type * variable = malloc(sizeof *variable);
Run Code Online (Sandbox Code Playgroud)

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

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