(这里的新手总数。据我了解,如果我用 C 编写以下内容:
p = malloc(sizeof(int));
这意味着我要求计算机为我保留 4 字节的内存,并将该 4 字节内存块的第一个字节的地址值分配给 p。
在 computer.howstuffworks.com/c29.htm,我们有:
p = (int *)malloc(sizeof(int));
这有何不同?
有区别;请参阅此处进行完整讨论:我是否投射 malloc 的结果?
最重要的一点是,如果您忘记#include <stdlib.h>
,则转换可以隐藏错误 如果没有转换,这是一个错误。使用强制转换,但没有包含,C 将假定 malloc()
返回一个可能与指针大小不同的int
。在这种情况下,实数函数的返回值将被砍掉(如果指针长于int
,例如,在 64 位机器上)并导致指针无效。
> malloc 默认返回一个void*
。
在第二种情况下,您将其转换为int*
注意:在 C 语言中,您不必进行强制转换。也就是说,这两个语句是 100% 等效的:
char *x = malloc(100);
char *y = (char *)malloc(100);
与 void * 之间的转换隐含在 C 中。
malloc
返回一个可以void *
,因为将void *
转换为另一种指针类型是安全且自动的。第二种情况不必要地将malloc
的结果强制转换为int *
,您不应强制转换malloc
的结果,因为它可以隐藏错误消息并且不是必需的。例如,如果您忘记包含stdlib.h
您应该会看到类似于以下内容的警告:
初始化使指针从整数不带强制转换
因为在许多编译器中,malloc
将被隐式声明为返回int
。