(这里总新手。)根据我的理解,如果我在C中编写以下代码:
p = malloc(sizeof(int));
这意味着我要求计算机为我保留4个字节的内存,并将p分配给该4字节内存块的第一个字节的地址值。
在computer.howstuffworks.com/c29.htm,我们改为:
p = (int *)malloc(sizeof(int));
这有什么不同?
答案 0 :(得分:4)
是的区别;请参阅此处进行全面讨论:Do I cast the result of malloc?
最重要的一点是,如果忘记#include <stdlib.h>
没有演员表,则施法可以隐藏错误,这是一个错误。使用强制转换,但没有包含,C将假定malloc()
返回int
,它可能与指针的大小不同。在这种情况下,实函数的返回值将被切断(如果指针比64 {1}机器上的int
长)并导致指针无效。
答案 1 :(得分:1)
malloc
返回void *
,这是可以的,因为将void *
转换为另一种指针类型是安全且自动的。第二种情况不必要地将malloc
的结果转换为int *
,你不应该转换malloc
的结果,因为它可以隐藏错误消息而不是必需的。例如,如果您忘记包含stdlib.h
,则会看到类似于以下内容的警告:
初始化使得指针来自整数而没有强制转换
因为在许多编译器中malloc
将被隐式声明为返回int
。
答案 2 :(得分:1)
malloc默认返回void*
。
在第二种情况下,您将其投射到int*
注意:在C中你不必进行演员表演。也就是说,这两个陈述是100%等价的:
char *x = malloc(100);
char *y = (char *)malloc(100);
来自void *的转换隐含在C中。