指向结构的指针的 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);
那样的话,你有两个优势,
- 您的语句与变量的类型无关。
- 错误输入所需尺寸的几率较小。
在我不小心使用的代码中
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);
那样的话,你有两个优势,
- 您的语句与变量的类型无关。
- 错误输入所需尺寸的几率较小。