Malloc困惑

嗨,经过这里回答

1:我输入malloc的结果吗? 我明白我们之所以不投malloc的原因之一就在于此

铸造malloc是多余的

但是我仍然试图弄清楚的是当我们施放malloc函数时会被抑制的警告

我也读过这个答案,但我有以下疑惑

#include<stdio.h>
main()
{
    int *a=malloc(20);
}

我理解了答案中的一点,即编译器会认为malloc返回一个int,而我们试图将该值赋给一个int *,这会给我们带来错误,无法从int *转换为int或类似的东西,但基本问题是

编译器是否不存在stdlib.h将malloc作为用户定义的函数处理,并且不会查找它的声明,并且会给出与缺少定义/定义有关的错误


在原来的C语言中 - C89 / 90--调用一个未声明的函数并不是错误。 出于这个原因,由于缺少函数声明,C99之前的编译器不会产生任何“错误”。 编译器将简单地假定该函数返回一个int

它也会自动和安静地从您在调用中提供的参数类型中“猜测”(推断,派生)函数参数类型。 在你的例子中,你提供了20 ,这将使编译器猜测“未知” malloc函数采用int类型的单个参数。 请注意,这也是不正确的,因为真正的malloc需要size_t参数。

在C99及更高版本中,函数声明是必需的。 这意味着忘记声明malloc (例如忘记包含<stdlib.h> )确实是一个错误,这将导致一条诊断消息。 (尽管如此,参数猜测行为仍然存在于语言中。)

还要注意,在C99和更高版本中,声明没有显式返回类型int main函数是非法的。 “隐式int”规则仅针对C语言规范的原始版本。 它不再存在于C99及更高版本中。 你必须声明它为int main(...明确。


在没有stdlib.h的情况下,编译器认为malloc()函数将返回int (对于C89 / 90而不是从c99),并且您试图将该值赋给int * ,因此存在类型不匹配,编译器会报告它

链接地址: http://www.djcxy.com/p/28363.html

上一篇: Malloc confusion

下一篇: how to pass strings to char array in C