C中malloc和(int*)malloc的区别
(这里完全是新手。)据我所知,如果我用C编写以下代码:C中malloc和(int*)malloc的区别,c,malloc,C,Malloc,(这里完全是新手。)据我所知,如果我用C编写以下代码: p = malloc(sizeof(int)); 这意味着我要求计算机为我保留4字节的内存,并将该4字节内存块的第一个字节的地址值分配给p 在computer.howtuffworks.com/c29.htm上,我们有: p = (int *)malloc(sizeof(int)); 这有什么不同?malloc返回一个void*,这是可以的,因为将void*转换为另一种指针类型是安全和自动的。第二种情况不必要地将malloc的结果强制转
p = malloc(sizeof(int));
这意味着我要求计算机为我保留4字节的内存,并将该4字节内存块的第一个字节的地址值分配给p
在computer.howtuffworks.com/c29.htm上,我们有:
p = (int *)malloc(sizeof(int));
这有什么不同?
malloc
返回一个void*
,这是可以的,因为将void*
转换为另一种指针类型是安全和自动的。第二种情况不必要地将malloc
的结果强制转换为int*
,您不应该强制转换malloc
的结果,因为它可以隐藏错误消息,并且不是必需的。例如,如果您忘记包含stdlib.h
,您将看到类似以下内容的警告:
初始化使指针从整数变为不带强制转换的整数
因为在许多编译器中,
malloc
将被隐式声明为返回int
malloc默认返回一个void*
在第二种情况下,将其强制转换为int*
注意:在C语言中,你不必做演员。也就是说,这两种说法是100%等效的:
char *x = malloc(100);
char *y = (char *)malloc(100);
void*与void*之间的转换在C中是隐式的。存在差异;有关详细讨论,请参见此处:
最重要的一点是,如果您忘记在没有强制转换的情况下包含,则强制转换可以隐藏错误,这是一个错误。使用强制转换,但不使用include,C将假定
malloc()
返回一个int
,该值可能与指针大小不同。在这种情况下,实函数的返回值将被截断(如果指针比64位机器上的int
长),并导致无效指针。需要澄清的是:因此第二行代码(我引用自HowtuffWorks)是不明智的,而第一行是首选的?@KennyLJ是的,第一行对于纯C++,最好是(不强制)。对于C++,必须强制转换(否则是错误的;在C++中,强制转换是安全的,因为C++不假定存在未定义的函数)。除非在一些罕见的情况下显示一个真正的C程序,否则不使用C库。@它本身不必是一个完整的程序,而只是一个编译单元。(.c
文件)。不引用C库的模块非常常见。请重新考虑您的否决票。请注意,C99取消了implcitint
声明,因此这不再是一个真正的考虑因素;但是,仍然应该取消强制转换,因为它是不必要的,只会增加视觉混乱。强制转换malloc
是K&R C的一种保留;最初,*alloc
函数返回一个char*
,因此如果目标是不同的指针类型,则需要强制转换。1989年的标准引入了void*
,专门用作“通用”指针类型。C编译器应该执行从void*
到int*
的隐式转换,因此显式转换基本上是不必要的。