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

指向结构的指针的malloc工作为什么?,c,pointers,malloc,structure,sizeof,C,Pointers,Malloc,Structure,Sizeof,在我无意中使用的代码中 list* Head = malloc(sizeof(list*)); 而不是正确的 list* Head = malloc(sizeof(list)); 创建一个新的列表类型节点,但稍后它工作正常 所以我的问题是它为什么能正常工作?这里的想法是,malloc()不知道(类型/大小),也不知道返回值将分配给哪个变量。它接受输入参数,分配请求大小的内存,并返回一个指向内存块的指针,就是它。所以,如果您请求了错误大小的内存块,malloc()没有任何东西可

在我无意中使用的代码中

    list* Head = malloc(sizeof(list*));
而不是正确的

    list* Head = malloc(sizeof(list));
创建一个新的
列表
类型节点,但稍后它工作正常


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

这里的想法是,
malloc()
不知道(类型/大小),也不知道返回值将分配给哪个变量。它接受输入参数,分配请求大小的内存,并返回一个指向内存块的指针,就是它。所以,如果您请求了错误大小的内存块,
malloc()
没有任何东西可以阻止您这样做。一旦使用返回的指针,您将

  • 当分配的大小超过目标类型所需的大小时,会浪费内存
  • 当请求的大小小于目标类型所需的大小时,通过访问绑定外内存导致
现在,无论哪种情况,您都可以看到它正常工作。前者在某种程度上是允许的(尽管应该避免),但后者是严格禁止的


忠告:

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

  type * variable = malloc(sizeof *variable);
在这种情况下,你有两个优势

  • 您的语句与变量的类型解耦
  • 错误输入所需大小的可能性较小

  • 你说工作是什么意思?编译成功或者您的程序运行正常?编译成功,当我调试它时,它存储了int值并在内存中显示为
    sizeof(list*)
    大于或等于
    sizeof(list)
    或者您有未定义的行为。因此,
    sizeof(list*)
    不大于或等于
    sizeof(list)
    ,因此您有未定义的行为。如果使用
    gcc
    ,请尝试使用
    -fsanitize=undefined
    @muhammadshoaib编译。请注意,未定义的行为包括“显然工作正常”。谷歌。您的fauly程序可能运行100次,但第101次失败。或者,如果您在另一台计算机上编译并运行它,则每次都可能失败,或者发生任何其他情况。