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



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

我知道,在没有包含<stdlib.h>头文件的情况下,编译器隐式声明了一个返回类型为int的函数。

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

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

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新