之前我问了一个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 *
类型,还是有其他原因?
我知道我无法正确解释我的问题,但如果有人理解,请向我解释一下。
答案 0 :(得分:10)
对于C,所有未声明的函数都被隐式声明为返回int
并采用未指定数量的未指定参数。
malloc
的问题是int
和void *
的大小可能不同,甚至不兼容。例如,在现代64位机器上,指针是64位类型,而int
是32位类型,所以如果你没有正确的malloc
声明,编译器将会降低高位32位指针。
答案 1 :(得分:1)
在标准C中,这绝不会发生。如果您忘记在标准编译器上包含<stdlib.h>
然后调用malloc,您将得到编译器错误“隐式声明”或类似的,因为该函数没有原型。
在较旧的,过时的C标准版本中,有一条规则说,如果没有看到被调用函数的原型,则假定该函数的返回类型为int
。这当然是非常危险的,并导致各种模糊的错误。因此,15年前,当标准C99发布时,隐含的int“特性”已从C语言中删除。