list.hC: разыменования указателя на неполный тип односвязный список
#ifndef LIST_H
#define LIST_H
/* Function prototypes */
struct nodeStruct* List_createNode(int item);
#endif
list.c
#include <stdio.h>
#include <stdlib.h>
struct nodeStruct {
int item;
struct nodeStruct *next;
};
struct nodeStruct* List_createNode(int item) {
struct nodeStruct *node = malloc(sizeof(struct nodeStruct));
if (node == NULL) {return NULL;}
node->item = item;
node->next = NULL;
return node;
}
main.c:
#include "list.h"
#include <assert.h>
#include <sys/types.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
struct nodeStruct *one = List_createNode(1);
while(one != NULL) {
printf("%d", one->item); //error
one= one->next; //error
}
Ошибка: error: dereferencing pointer to incomplete type printf("%d", one->item);
Ошибка one->item
, я попытался использовать несколько комбинаций для разыменования, но, похоже, не работает. Каков правильный подход?
Обновлено:
list.h
#ifndef LIST_H
#define LIST_H
struct nodeStruct {
int item;
struct nodeStruct *next;
};
/* Function prototypes */
struct nodeStruct* List_createNode(int item);
#endif
Теперь ошибка, invalid application of ‘sizeof’ to incomplete type ‘struct nodeStruct’ struct nodeStruct *node = malloc(sizeof(struct nodeStruct));
Из моего файла list.c.
Вы включили определение 'struct nodeStruct' в основной файл .c? Кроме того, вы, вероятно, захотите удалить * в 'one = * one-> next;'. О, и изменение «одного» может привести к утечке памяти. – EOF
@EOF это не проблема, потому что другие методы работают. – Aaron
Таким образом, определение 'struct nodeStruct' фактически не доступно для main() **. Поместите определение * struct nodeStruct в 'list.h'. Подсказка: теперь он находится в 'list.c'. – EOF