Malloc混淆

时间:2015-06-09 05:13:05

标签: c pointers malloc

嗨,经过这里的回答

1Do 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相关的一些错误

2 个答案:

答案 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}}因此存在类型不匹配,编译器将报告它