маллок не определено - PullRequest
       5

маллок не определено

5 голосов
/ 25 декабря 2010

В настоящее время я работаю над перезаписью модуля связанного списка и получаю некоторые странные ошибки.

В двух IDE (Netbeans & Visual Studio Express) я получаю предупреждение, что malloc не определено, и функция, найденная в моем файле connectedlist.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  

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

Любая помощь будет принята с благодарностью.Я не уверен, что это проблема синтаксиса или отсутствуют файлы на моем компьютере.

Ответы [ 4 ]

15 голосов
/ 25 декабря 2010

Куда вы включаете <stdlib.h> - потому что именно там объявлено malloc()?

Это проблема компиляции (malloc() undeclared) или проблема компоновки (malloc() undefined)?

Что именно такое сообщение об ошибке?


Теперь код доступен для чтения:

  • <cstdlib> - это заголовок C ++ (как и <cstdio>).
  • Вам необходимо включить <stdlib.h> в C.
  • Вам нужно включить <stdlib.h>, где используется функция malloc() - в 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 - последняя некомментированная, непустая строка в файле, а не третья.


Ваши структуры данных чрезвычайно сложны даже для двусвязного списка. Вы уверены, что вам понадобится длина так часто, что это гарантирует сохранение указателя на голову в каждом узле списка? Я был бы удивлен, если вы используете это так часто. Я предполагаю, что у вас есть указатель на голову в каждом узле, так что, когда вы удаляете произвольный узел из списка, вы можете уменьшить длину списка. Возможно, вам лучше передать указатель на список и указатель на удаляемый узел, чем то, что у вас есть.

Я не вижу оправдания для length = 5 в функции new_list().


Кроме того, 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) необходимо (или должно быть) необходимо для переменных, объявленных в заголовках, я предпочитаю симметрию для функций, объявленных в заголовках.

2 голосов
/ 14 января 2014

Судя по вашему вопросу, вы находитесь на компьютере с Windows. Возможно, вам придется сделать:

#include <windows.h>

для того, чтобы malloc () был доступен.

1 голос
/ 25 декабря 2010

cstdlib и cstdio не являются стандартными заголовками C.Возможно, вы имели в виду stdlib.h и stdio.h.

0 голосов
/ 17 мая 2016

вы должны использовать malloc(), как показано ниже:

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