malloc混乱
Malloc confusion
你好,看完这里的回答后
1: Do I cast the result of malloc? 我了解到我们不使用 malloc 的原因之一是
转换 malloc 是多余的
但我仍在努力弄清楚的是当我们转换 malloc 函数时将被抑制的警告
我也看了this的回答,但有以下疑问
#include<stdio.h>
main()
{
int *a=malloc(20);
}
我理解答案中的要点,即编译器会认为 malloc returns 是一个 int,而我们正试图将该值赋给 int *,这会给我们带来错误 cannot convert from int * to int or类似的东西,但基本问题是
如果没有 stdlib.h,编译器不会将 malloc 视为用户定义的函数,它不会查找它的声明,并且会给出一些与缺少 delcaration/defination
在没有 stdlib.h
的情况下,编译器认为 malloc()
函数将 return int
(对于 C89/90 而不是来自 c99)并且你正在尝试将该值分配给 int *
,因此存在类型不匹配,编译器将报告它
在原始的 C 语言中 - C89/90 - 调用未声明的函数不是错误。因此,由于缺少函数声明,C99 之前的编译器不会生成任何 "error"。编译器将简单地假定函数 return 是一个 int
。
它还会自动且安静地 "guess"(推断、派生)您在调用中提供的参数类型的函数参数类型。在您的示例中,您提供了 20
,这将使编译器猜测 "unknown" malloc
函数采用 int
类型的单个参数。请注意,这也是不正确的,因为真正的 malloc
需要一个 size_t
参数。
在 C99 及更高版本中,函数声明是必需的。这意味着忘记声明 malloc
(例如忘记包含 <stdlib.h>
)确实是一个错误,这将导致诊断消息。 (尽管语言中仍然存在参数猜测行为。)
另请注意,在 C99 及更高版本中,在没有显式 return 类型 int
的情况下声明函数 main
是非法的。 "implicit int" 规则仅特定于 C 语言规范的原始版本。它不再存在于 C99 及更高版本中。您必须明确地将其声明为 int main(...
。
你好,看完这里的回答后
1: Do I cast the result of malloc? 我了解到我们不使用 malloc 的原因之一是
转换 malloc 是多余的
但我仍在努力弄清楚的是当我们转换 malloc 函数时将被抑制的警告
我也看了this的回答,但有以下疑问
#include<stdio.h>
main()
{
int *a=malloc(20);
}
我理解答案中的要点,即编译器会认为 malloc returns 是一个 int,而我们正试图将该值赋给 int *,这会给我们带来错误 cannot convert from int * to int or类似的东西,但基本问题是
如果没有 stdlib.h,编译器不会将 malloc 视为用户定义的函数,它不会查找它的声明,并且会给出一些与缺少 delcaration/defination
在没有 stdlib.h
的情况下,编译器认为 malloc()
函数将 return int
(对于 C89/90 而不是来自 c99)并且你正在尝试将该值分配给 int *
,因此存在类型不匹配,编译器将报告它
在原始的 C 语言中 - C89/90 - 调用未声明的函数不是错误。因此,由于缺少函数声明,C99 之前的编译器不会生成任何 "error"。编译器将简单地假定函数 return 是一个 int
。
它还会自动且安静地 "guess"(推断、派生)您在调用中提供的参数类型的函数参数类型。在您的示例中,您提供了 20
,这将使编译器猜测 "unknown" malloc
函数采用 int
类型的单个参数。请注意,这也是不正确的,因为真正的 malloc
需要一个 size_t
参数。
在 C99 及更高版本中,函数声明是必需的。这意味着忘记声明 malloc
(例如忘记包含 <stdlib.h>
)确实是一个错误,这将导致诊断消息。 (尽管语言中仍然存在参数猜测行为。)
另请注意,在 C99 及更高版本中,在没有显式 return 类型 int
的情况下声明函数 main
是非法的。 "implicit int" 规则仅特定于 C 语言规范的原始版本。它不再存在于 C99 及更高版本中。您必须明确地将其声明为 int main(...
。