警告:函数“malloc”的隐式声明,即使包含 <stdlib.h>也是如此

Warning: implicit declaration of function ‘malloc’, even if <stdlib.h> is included

提问人:Kyle 提问时间:5/16/2020 最后编辑:Kyle 更新时间:8/3/2022 访问量:1957

问:

这是一段代码的摘录,我在其中用数组的元素填充了一个列表。

#include <stdlib.h>
#include <stdio.h>
#include "../../lib/kernel/list.h"
#include "./listpop.h"

struct item {
    struct list_elem elem;
    int value;
    int priority;
};

void populate(struct list * l, int * a, int n);

void populate(struct list * l, int * a, int n)
{
  int i = 0;
  while(i != n) {
    struct item * newitem = malloc(sizeof(struct item));
    newitem->value = a[i];
    list_push_back(l,newitem);
    i++;
  }
}

void test_assignment_1()
{   struct list our_list;
    list_init(&our_list);
    populate(&our_list, ITEMARRAY, ITEMCOUNT);
}

list.h 中的代码:

/* List element. */
struct list_elem 
{
  struct list_elem *prev;     /* Previous list element. */
  struct list_elem *next;     /* Next list element. */
};

/* List. */
struct list 
{
  struct list_elem head;      /* List head. */
  struct list_elem tail;      /* List tail. */
};

void list_init (struct list *);

list.c 中的代码:

/* Initializes LIST as an empty list. */
void
list_init (struct list *list)
{
  ASSERT (list != NULL);
  list->head.prev = NULL;
  list->head.next = &list->tail;
  list->tail.prev = &list->head;
  list->tail.next = NULL;
}

最后,listpop.h 中的代码:

#define ITEMCOUNT 10
int ITEMARRAY[ITEMCOUNT] = {3,1,4,2,7,6,9,5,8,3};

以下是我收到的警告:

warning: implicit declaration of function ‘malloc’

warning: incompatible implicit declaration of built-in function ‘malloc’

到目前为止,我所读到的关于这些警告的所有内容都是添加 stdlib.h,但正如您从我的代码中看到的那样,我已经这样做了,并且代码仍然给我这些警告。我已经多次重新启动代码,因此错误位于代码中的某个位置。

有谁知道这里有什么不起作用吗?

C 列表 malloc

评论

1赞 Keith Thompson 5/16/2020
请在您的问题中包括一个最小的可重复示例。我没有收到这些警告,但我确实在未声明的类型上收到错误。最有可能的是,错误出在你没有向我们展示的代码中。struct list_elem
1赞 Nate Eldredge 5/16/2020
您是否从更微不足道的示例中得到相同的错误?
1赞 Steve Friedl 5/16/2020
你能说出你正在使用的编译器和版本吗?
3赞 Eugene Sh. 5/16/2020
您在编译之前是否保存了文件?这是文件中的确切代码吗?因为它的行为不应该像你描述的那样。
0赞 Kyle 5/16/2020
各位,我已经更新了问题,提供了有关代码的更多详细信息。问我是否需要其他东西。关于编译器的版本,可悲的是我不知道如何检索它。

答:

0赞 chqrlie 5/16/2020 #1

您可能正在使用不符合标准的编译器和/或 C 库在过时的系统上进行编译。尝试先包含标准标头,并始终包含标准标头。<malloc.h><stdlib.h>

评论

0赞 Kyle 5/16/2020
我在开头添加了代码,但它给了我一个错误。#include <malloc.h>
0赞 chqrlie 5/16/2020
@Kyle:好吧,不是正确的解释。您是否在另一个包含之前移动了 和其他标准标头?#include <stdlib.h>
0赞 Kyle 5/16/2020
是的,它仍然给我一个错误 <malloc.h>。我在虚拟机上运行代码。这可能是问题所在吗?