嗨,经过这里的回答
1:Do I cast the result of malloc?我明白我们不投出malloc的原因之一是
施放malloc是多余的
但我仍然想弄清楚的是当我们施放malloc函数时会被抑制的警告
我也读过this回答,但我有以下疑虑
#include<stdio.h>
main()
{
int *a=malloc(20);
}
我理解答案中的一点,编译器会认为malloc返回一个int,同时我们试图将该值赋给一个int *,这将给我们错误无法将int *转换为int或类似的东西但是基本的问题是
在没有stdlib.h的情况下,编译器不会将malloc视为用户定义的函数,并且不会查找它的声明,并且它会给出与缺少的delcaration / defination相关的一些错误
答案 0 :(得分:10)
在原始C语言 - C89 / 90中 - 调用未声明的函数不是错误。因此,由于缺少函数声明,pre-C99编译器不会产生任何“错误”。编译器将简单地假设该函数返回int
。
它还将从您在调用中提供的参数类型中自动且安静地“猜测”(推断,推导)函数参数类型。在您的示例中,您提供了20
,这将使编译器猜测“未知”malloc
函数采用类型为int
的单个参数。请注意,这也是不正确的,因为真实malloc
需要size_t
参数。
在C99及更高版本中,需要函数声明。这意味着忘记声明malloc
(例如忘记包含<stdlib.h>
)确实是一个错误,这将导致诊断消息。 (参数猜测行为仍然存在于语言中。)
另请注意,在C99及更高版本中声明函数main
而没有显式返回类型int
是非法的。 “隐式int”规则仅适用于C语言规范的原始版本。它在C99及更高版本中不再存在。您必须明确声明它为int main(...
。
答案 1 :(得分:4)
在没有stdlib.h
的情况下,编译器认为malloc()
函数将返回int
(对于C89 / 90而不是来自c99),并且您正在尝试将该值赋给{ {1}}因此存在类型不匹配,编译器将报告它