web-dev-qa-db-ja.com

malloc未定義

現在、リンクリストモジュールの書き換えに取り組んでいますが、奇妙なエラーが発生します。

2つの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);  
}

linkedlist.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  

linkedlist.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;  
}  

どんな助けでも大歓迎です。これが構文の問題なのか、コンピューター上のファイルが不足しているのかわかりません。

7
FrostedPixel

_<stdlib.h>_をどこに含めますか?それはmalloc()が宣言されている場所だからですか?

これはコンパイルの問題(malloc() undeclared)ですか、それともリンクの問題(malloc() undefined)ですか?

エラーメッセージは正確には何ですか?


これでコードが読み取り可能になりました。

  • _<cstdlib>_はC++ヘッダーです(_<cstdio>_も同様です)。
  • Cに_<stdlib.h>_を含める必要があります。
  • malloc()関数が使用される場所である_<stdlib.h>_を_linkedlist.c_に含める必要があります。

また、_linkedlist.h_の間違った場所にヘッダーガードがあります。ヘッダーファイルの正規構造は次のとおりです。

_#ifndef HEADER_H_INCLUDED
#define HEADER_H_INCLUDED

...the other material in the header...
...definitions and declarations...

#endif /* HEADER_H_INCLUDED */
_

_#endif_は、ファイル内の最後の非コメント、非空白行であり、3番目ではありません。


二重にリンクされたリストであっても、データ構造は非常に複雑です。リスト内のすべてのノードでヘッドへのポインターを維持する必要があるほど頻繁に長さが必要になると確信していますか?そんなに頻繁に使っているとしたらびっくりします。リストから任意のノードを削除するときにリストの長さをデクリメントできるように、各ノードにポインタからヘッドがあると仮定します。リストへのポインタと削除するノードへのポインタを、取得したものよりも渡したほうがよいでしょう。

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)が必要である(または必要である)ため、ヘッダーで宣言された関数の対称性を好みます。

17

あなたの質問から、あなたはWindowsマシンを使用しているようです。あなたがしなければならないかもしれません:

#include <windows.h>

malloc()を使用可能にするため。

2
Ducain

cstdlibcstdioは標準のCヘッダーではありません。おそらくあなたはstdlib.hおよびstdio.h

1

以下のようにmalloc()を使用する必要があります。

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