繁体   English   中英

Malloc混乱

[英]Malloc confusion

嗨,经过这里的回答

1我是否施放了malloc的结果? 我明白我们不投出malloc的原因之一就是

铸造malloc是多余的

但我仍然想弄清楚的是当我们转换malloc函数时将被抑制的警告

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

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

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

在没有stdlib.h的情况下,编译器不会将malloc视为用户定义的函数,并且不会查找它的声明,并且它会给出一些与缺少的delcaration / defination相关的错误

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM