Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C中malloc和(int*)malloc的区别_C_Malloc - Fatal编程技术网

C中malloc和(int*)malloc的区别

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的结果强制转

(这里完全是新手。)据我所知,如果我用C编写以下代码:

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取消了implcit
int
声明,因此这不再是一个真正的考虑因素;但是,仍然应该取消强制转换,因为它是不必要的,只会增加视觉混乱。强制转换
malloc
是K&R C的一种保留;最初,
*alloc
函数返回一个
char*
,因此如果目标是不同的指针类型,则需要强制转换。1989年的标准引入了
void*
,专门用作“通用”指针类型。C编译器应该执行从
void*
int*
的隐式转换,因此显式转换基本上是不必要的。