指向结构的指针的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次失败。或者,如果您在另一台计算机上编译并运行它,则每次都可能失败,或者发生任何其他情况。