为什么每次使用malloc时都会收到警告?

115

如果我在代码中使用 malloc

int *x = malloc(sizeof(int));

我从gcc收到了这个警告:

new.c:7: warning: implicit declaration of function ‘malloc’  
new.c:7: warning: incompatible implicit declaration of built-in function ‘malloc’
5个回答

228
你需要添加:

#include <stdlib.h>

这个文件包括了内置函数 malloc 的声明。如果你不这样做,编译器会认为你想要定义自己的名为malloc的函数,并警告你,因为:

  1. 你没有明确地声明它 而且
  2. 已经存在一个名为malloc的内置函数,其签名与隐式声明的函数(当一个函数被隐式声明时,其返回类型和参数类型被假定为int,这与内置的malloc不兼容,后者接受一个size_t并返回一个void*

5
术语问题:C语言中没有所谓的内置函数。malloc只是标准C库中的一个函数。 - Jens
5
我认为将标准库函数称为内置函数并没有问题,gcc人员似乎也持相同看法,因为错误信息也使用了“内置”这个词(这就是我也用这个词的原因)。 - sepp2k
7
@sepp2k 好的,我确实看到了问题。使用是非标准的。编译器 可以有内置函数,gcc 可能有内置的 malloc 函数。但正如我所写的,在 C 中,没有内置函数。 - Jens

30

您没有执行 #include <stdlib.h>


16

你需要包含声明该函数的头文件,例如:

#include <stdlib.h>

如果你不包含这个头文件,编译器就不知道这个函数。所以它将其视为未声明的。


10

养成查看函数帮助文档的习惯。

C语言的大部分帮助文档都基于Unix手册页。

使用:

man malloc

提供相当有用的结果。

搜索 man malloc 将向您展示我所说的内容。

在Unix中,您还可以获得与此相关的 apropos。


1
只有当您已经知道概要中的行#include <stdlib.h>意味着您必须在程序中编写它时,才能这样做。 - Mechanical snail
1
如果有人阅读了这里的其他答案,那么他们现在应该知道。 - MikeKulls

0

除了其他非常好的答案外,我想进行一点挑剔并涵盖其他答案中尚未讨论的内容。


当您在Linux系统上编写代码时,如果要使用malloc()函数,实际上您并不必须要#include <stdlib.h>头文件。(然而,因为该头文件提供了许多有用的C标准库函数和宏,所以在非玩具程序中,使用stdlib.h是很常见的,也应该包含在内)。

您也可以使用#include <malloc.h>来代替。但请注意,现在已经不推荐使用malloc.h,因为这使得您的代码不可移植。如果您想使用malloc()函数,除非有明确的原因要求不这样做,否则您应该始终#include <stdlib.h>

关于为什么,请参考以下问题的答案:

<stdlib.h>和<malloc.h>之间的区别


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接