【问题标题】:malloc undefinedmalloc 未定义
【发布时间】:2010-12-25 06:00:46
【问题描述】:

我目前正在重写一个链表模块,我收到了一些奇怪的错误。

在两个 IDE(Netbeans 和 Visual Studio Express)中,我收到一个警告,提示 malloc 未定义,并且在我的linkedlist.c 文件中找到的函数也未定义。

以下是我的 3 个文件。

main.c

#include <stdlib.h>  
#include <stdio.h>  
#include "linkedlist.h"  
int main(void){  
 struct linked_list * l_list;   
 l_list = new_list();  
 printf("%i", l_list->length);  
 getchar();  
 return (EXIT_SUCCESS);  
}

链表.h

#ifndef LINKEDLIST_H  
#define LINKEDLIST_H  
struct linked_list{  
 int length;  
 struct linked_list_node * head_node_ptr;  
};  
struct linked_list_node{  
 struct linked_list_node * prev_node_ptr;  
 struct linked_list_node * next_node_ptr;  
 struct linked_list_data * head_data_ptr;  
};  
struct linked_list_data{  
 struct linked_list_data * prev_data_ptr;  
 struct linked_list_data * next_data_ptr;  
 void * data;  
};  
struct linked_list * new_list();  
#endif  

链表.c

#include "linkedlist.h"  
struct linked_list * new_list(){  
 struct linked_list * temp_list = malloc(sizeof(struct linked_list));  
 temp_list->length = 5;  
 return temp_list;  
}  

任何帮助将不胜感激。我不确定这是语法问题还是我的计算机上缺少文件。

【问题讨论】:

    标签: c header malloc undefined


    【解决方案1】:

    您在哪里包含 &lt;stdlib.h&gt; — 因为那是声明 malloc() 的地方?

    这是编译问题(malloc() undeclared)还是链接问题(malloc() undefined)?

    错误信息到底是什么?


    现在代码可读了:

    • &lt;cstdlib&gt; 是 C++ 标头(&lt;cstdio&gt; 也是如此)。
    • 您需要在 C 中包含 &lt;stdlib.h&gt;
    • 您需要在使用malloc() 函数的地方包含&lt;stdlib.h&gt; — 在linkedlist.c 中。

    您还 linkedlist.h 中将标头保护放在了错误的位置,但问题中的代码已经更新。原来的顺序是:

    #ifndef LINKEDLIST_H  
    #define LINKEDLIST_H
    #endif
    struct linked_list{
    …
    

    头文件的规范结构是:

    #ifndef HEADER_H_INCLUDED
    #define HEADER_H_INCLUDED
    
    ...the other material in the header...
    ...definitions and declarations...
    
    #endif /* HEADER_H_INCLUDED */
    

    #endif 是文件中最后一个非注释非空行,而不是第三个。


    即使是双向链表,您的数据结构也异常复杂。您确定您将需要如此频繁的长度以保证在列表中的每个节点中维护指向头部的指针吗?如果您经常使用它,我会感到惊讶。我假设您在每个节点中都有指向头的指针,因此当您从列表中删除任意节点时,您可以减少列表的长度。传递一个指向列表的指针和指向要删除的节点的指针可能比你得到的更好。

    我认为new_list() 函数中的length = 5 没有任何理由。


    此外,C 和 C++ 在以下含义上存在根本差异:

    struct linked_list * new_list();
    

    在 C++ 中,这意味着“new_list() 是一个不带参数并返回 struct linked_list 指针的函数”。

    在 C 中,这意味着“new_list() 是一个具有完全不确定参数列表的函数,它返回一个 struct linked_list 指针”。函数已声明,但函数没有原型。

    在 C 中,你应该写:

    struct linked_list * new_list(void);
    

    就个人而言,我更喜欢在标题中的函数声明前面看到extern;对于函数来说它实际上不是必需的,但由于它 (extern) 对于头文件中声明的变量是(或应该是)必要的,所以我更喜欢头文件中声明的函数的对称性。

    【讨论】:

    • cstdio/cstdlib 是我的错误。我将更改预处理器防护装置,使它们位于正确的位置,然后再试一次。 linked_list_data * head_data_ptr 是指向头部数据的指针,而不是指向列表头部的指针,对不起,我真的必须多加评论。 length = 5 只是为了测试,当我运行这个程序时,即使它给了我错误,输出仍然是我在函数中设置的长度。
    • void *data 元素应该在linked_list_node 中,然后你根本不需要linked_list_data。您还应该在new_list() 函数中设置temp_list-&gt;head_node_ptr = 0;
    【解决方案2】:

    根据您的问题,您似乎在 Windows 机器上。您可能需要这样做:

    #include <windows.h>
    

    为了让 malloc() 可用。

    【讨论】:

      【解决方案3】:

      cstdlibcstdio 不是标准 C 头文件。也许你的意思是stdlib.hstdio.h

      【讨论】:

        【解决方案4】:

        您必须使用malloc(),如下所示:

        for (int i = 2; i < 10; i++){
           item *temp = (item*)malloc(sizeof(item));
           temp->data = i;
           pre->next = temp;
           pre = temp;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-03-30
          • 2014-10-14
          • 2013-10-19
          • 1970-01-01
          • 2015-03-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多