在一个代码中,我意外地使用了
list* Head = malloc(sizeof(list*));
而不是正确的
list* Head = malloc(sizeof(list));
创建一个新的list
类型的节点,但它后来运行得很好。
所以我的问题是为什么它能正常工作?
这里的想法是,malloc()
不知道(类型/大小),也不知道与要分配返回值的变量有关。它接受输入参数,分配所请求大小的内存,并返回一个指向内存块的指针,就这样。因此,如果您请求了错误大小的内存块,malloc()
不会阻止您这样做。一旦你使用返回的指针,你要么是
- 当分配的大小大于目标类型所需的大小时,会浪费内存
- 当请求的大小小于目标类型所需的大小时,通过访问超出绑定的内存导致未定义的行为
现在,无论在哪种情况下,您都可以看到它正常工作。前者在某种程度上是允许的(尽管应该避免),但后者是严格禁止的。
忠告:
为了避免这些类型的错误,请使用格式
type * variable = malloc(sizeof *variable);
在这种情况下,你有两个优势,
- 您的语句与变量的类型解耦
- 错误键入所需尺寸的可能性较小