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

时间:2014-01-24 08:33:17

标签: c malloc

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

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

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

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

2 个答案:

答案 0 :(得分:10)

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

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

答案 1 :(得分:1)

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

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