早些时候我问了一个问题,即如果malloc的返回被强制转换,那么将被标记的错误将被隐藏 我得到的答案是:在 C 的(旧方言)中,您可以调用尚未声明的函数;它隐式声明了一个返回类型为int
的函数。因此,如果您要在不包含标头的情况下调用malloc()
,则会得到错误地假定它返回int
的代码。如果没有强制转换,当您尝试将其分配给指针时,会出现编译器错误。使用强制转换,代码将进行编译,这可能会产生模糊的运行时错误和冗长的调试会话。
我知道,在没有包含<stdlib.h>
头文件的情况下,编译器隐式声明了一个返回类型为int
的函数。
但我感到困惑的是,根据 creator 定义的malloc()
函数定义,每当我们使用它时,它都会返回void *
,但没有<stdlib.h>
它就会返回int
。那么它的定义是如何变化的,编译器是隐式地将void *
更改为int *
类型,还是有其他原因?
我知道我无法正确解释我的问题,但如果有人理解,请解释一下。
对于 C,所有未声明的函数都隐式声明为返回int
并接受未指定数量的未指定参数。
malloc
的问题在于int
和void *
的大小可能不同,甚至不兼容。例如,在现代 64 位计算机上,指针是 64 位类型,而int
是 32 位类型,因此,如果您没有正确的malloc
声明,编译器将删除指针的高 32 位。
在标准 C 中,这永远不会发生。如果您忘记在标准编译器中包含<stdlib.h>
然后调用 malloc,您将收到编译器错误"隐式声明"或类似错误,因为该函数没有原型。
在较旧的、过时的 C 标准版本中,有一条规则说,如果没有被调用函数的原型可见,则假定函数的返回类型为int
。这当然是非常危险的,并导致各种晦涩难懂的错误。因此,隐式的int"特性"在15年前标准C99发布时从C语言中删除了。