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


110

如果我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

Answers:


224

您需要添加:

#include <stdlib.h>

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

  1. 您没有明确声明它
  2. 该名称已经有一个内置函数,其签名与隐式声明的签名不同(当隐式声明一个函数时,其返回值和参数类型假定为int,与内置函数不兼容)。在中malloc,它需要a size_t并返回void*)。

5
术语nit:C中没有内置函数。malloc只是Standard C库中的函数。
詹斯2012年

5
@Jens我不认为将标准库函数称为内置函数会出现问题-gcc人员显然也没有,因为错误消息也使用了“内置”一词(这就是我这样做的原因)。
sepp2k 2012年

7
@ sepp2k好吧,我确实看到了问题。用法是非标准的。编译器可以具有内置函数,而gcc可以具有malloc内置函数。但是正如我写的那样,在C中没有内置函数。
詹斯(Jens)2012年


16

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

#include <stdlib.h>

如果不包括此头文件,则编译器不知道该函数。因此,它认为它是未声明的。


10

养成在帮助中查找功能的习惯。

有关C的大多数帮助均以UNIX手册页为模型。

使用:

man malloc

给出了非常有用的结果。

谷歌搜索man malloc会告诉你我的意思。

在Unix中,您还会获得有关相关内容的适当建议。


1
仅当您已经知道#include <stdlib.h>摘要中的行意味着必须在程序中编写该行时。
机械蜗牛

1
如果有人在这里阅读了其他答案,那么他们现在就会知道。
MikeKulls

0

除了其他非常好的答案之外,我还想做一点点总结,并介绍其他答案中尚未讨论的内容。


当您使用Linux时,要malloc()在您的代码中使用,

您实际上不必 #include <stdlib.h>

(尽管的使用stdlib.h非常普遍,并且可能每个非玩具程序都应以任何一种方式包括它,因为它提供了许多有用的C标准库函数和宏)

您也可以#include <malloc.h>代替。

但是请注意,malloc.h不赞成使用,这会使您的代码不可移植。如果您想使用malloc(),则应始终使用(除非出于明确的原因否则要这样做)#include <stdlib.h>

原因为何,最好在回答这个问题的解释:

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.