当我们使用malloc而没有声明stdlib.h时头文件编译器返回一个int为什么?

之前我问了一个问题,即如果malloc的返回被强制转换,那么将被标记的错误被隐藏 ,我得到的答案是:在(较旧的方言)C中,你可以调用一个尚未声明的函数; 隐式声明一个返回类型为int的函数。 因此,如果您在不包含标头的情况下调用malloc() ,则会得到错误地认为它返回int 。 如果没有强制转换,当您尝试将其分配给指针时,会出现编译器错误。 使用强制转换,代码将被编译,可能会产生模糊的运行时错误和冗长的调试会话。

据我所知,如果不包含头文件,编译器会隐式声明一个返回类型为int的函数。

但我感到困惑的是,根据malloc()的创建者定义的函数定义,每当我们使用它时它将返回void * ,但是如果没有它返回int 。 那么它的定义如何改变,是编译器隐式地将void *改为int *类型,还是有其他原因?

我知道我无法正确解释我的问题,但如果有人理解,请向我解释一下。

对于C,所有未声明的函数都被隐式声明为返回int并采用未指定数量的未指定参数。

malloc的问题是intvoid *的大小可能不同,甚至不兼容。 例如,在现代64位机器上,指针是64位类型,而int是32位类型,因此如果没有正确的malloc声明,编译器将丢弃指针的高32位。

在标准C中,这永远不会发生。 如果您忘记在标准编译器上包含然后调用malloc,您将得到编译器错误“隐式声明”或类似的,因为该函数没有原型。

在较旧的,过时的C标准版本中,有一条规则说,如果没有看到被调用函数的原型,则假定该函数的返回类型为int 。 这当然是非常危险的,并导致各种晦涩的错误。 因此,15年前,当标准C99发布时,隐含的int“特性”已从C语言中删除。