为什么编译器假定malloc返回int?

为什么编译器假定malloc返回int?,c,malloc,return,C,Malloc,Return,我知道在C语言中,最好不要强制转换malloc()的返回值。我已经读到,如果不包含stdlib.h,编译器会假定malloc()返回一个int。当然,如果试图将int隐式分配给非int的对象,则会产生错误,但该错误可能会被显式强制转换所掩盖——因此显式强制转换malloc()的危险 对于我创建的任何函数,如果该函数不存在,编译器会告诉我。为什么编译器假设malloc()即使没有包含stdlib.h也返回int?不应该malloc()在包含stdlib.h之前保持未定义状态吗?这是每个函数的默认值

我知道在C语言中,最好不要强制转换
malloc()
的返回值。我已经读到,如果不包含
stdlib.h
,编译器会假定
malloc()
返回一个int。当然,如果试图将int隐式分配给非int的对象,则会产生错误,但该错误可能会被显式强制转换所掩盖——因此显式强制转换
malloc()
的危险


对于我创建的任何函数,如果该函数不存在,编译器会告诉我。为什么编译器假设
malloc()
即使没有包含
stdlib.h
也返回int?不应该
malloc()
在包含
stdlib.h
之前保持未定义状态吗?

这是每个函数的默认值


我的编译器告诉我,如果我没有定义函数,则不会定义
int testFunction()

除非另有规定,否则默认情况下所有函数都会返回
int


请参阅。

实际上,如果编译器没有看到您调用的任何函数(不仅仅是malloc)的声明,它将假定它是
extern
,并返回
int
。我使用过的大多数编译器都只对此给出警告,而不是错误,除非您提高警告级别

这可以追溯到C的早期,我认为C99不允许这样做

@迈克尔的评论:根据K&R(第72页),你似乎是对的:


如果之前未声明的名称出现在表达式中并后跟左括号,则上下文会将其声明为函数名,函数将假定返回int,并且其参数不作任何假定

就像@Burkhard说的,这是默认值。如果您没有为函数定义原型,编译器将发出警告,并假设函数返回int。然后,如果您真的没有定义,链接器将立即向您发出停止错误。

实际上,我很确定编译器不会对未声明函数的参数数量进行任何假设。这就好像您声明了它
intfoo(…)
假设这是可能的(我认为不是,因为标准C中的varargs至少需要一个必需的参数)。不过,我身上没有Harbison和Steele的副本,所以我可能错了。不,这就像它被声明为
int foo()
——这是一个参数数量尚未确定(但确定!)的函数;而不是
intfoo(void)
——这是一个没有参数的函数;或者
intfoo(…)
——正如您所说,这是无效的。