2010-10-28 39 views
20

tôi nhận được lỗi này khi biên dịch c này nguồn tập tinkích thước lưu trữ của 'tên' không biết

/INIT_SOURCE_BUILD/src/names_list.c:7: error: storage size of ‘names’ isn’t known

#include <stdio.h> 
#include "list.h" 

int main(){ 

    struct List names; 
    names->size = 3; 

    struct ListElmt michael; 
    struct ListElmt john; 
    struct ListElmt adams; 

    names->head = michael; 

    michael->data = 12; 
    michael->next = john; 
    john->data = 14; 
    john->next = adams; 
    adams->data = 16; 

    struct ListElmt pointer = List->head; 
    for(int x = 0; x < 3 ; x++){ 
     printf("Iteration.%d data: %d", x, pointer->data); 
     pointer->next = pointer->next->next; 
    } 
} 

và đây là tiêu đề của danh sách liên kết này

#ifndef LIST_H 
#define LIST_H 

#include <stdio.h> 

/*          Define linked list elements*/ 

typedef struct _ListElmt{ 

void    *data; 
struct _ListElmt  *next; 

} ListElmt; 

/*          Define a structure for the list*/ 

typedef struct _List{ 

int     size; 
int     (*match)(const void *key1, const void *key2); 
void    (*destroy)(void *data); 

ListElmt    *head; 
ListElmt    *tail; 

} List; 

void list_init(List *list, void (*destroy)(void *data)); 

void list_destroy(List *list); 

int list_ins_next(List *list, ListElmt *element, const void *data); 

int list_rem_next(List *list, ListElmt *element, void **data); 

int list_size(const List *list); 

ListElmt *list_head(const List *list); 

ListElmt *list_tail(const List *list); 

int list_is_head(const ListElmt *element); 

int list_is_tail(const ListElmt *element); 

void *list_data(const ListElmt *element); 

ListElmt *list_next(const ListElmt *element); 
#endif 

Trả lời

36

Khi bạn typedef một struct như vậy, bạn không cần phải sử dụng struct khi tuyên bố nó:

List names; 

thay vì

struct List names; 

Nó cũng không phải là một con trỏ, vì vậy names->size nên names.size.

+4

+1 Chỉ cần một chú thích để làm cho nó rõ ràng hơn: 'struct List' không tồn tại. Có một 'struct _List' và một typedef' List' xác định cùng kiểu với 'struct _List'. * (Tôi ghét typedefs!) * – pmg

+0

Tôi có một lỗi name_list.c: 14: lỗi: đối số kiểu không hợp lệ của '->' (có 'Danh sách') –

+0

@Sam: con trỏ dùng phím tắt '->' để truy cập thành viên , các cấu trúc đơn giản truy cập chúng bằng '.'. – pmg

3

struct List names; không khai báo một con trỏ, nhưng bạn đang cố gắng để dereference nó (sử dụng ->). Sử dụng names.size để thay thế.

3

Cấu trúc được gọi là _List. Typedef là List. Vì vậy, bạn muốn

List names; 

hoặc

struct _List names; /* probably not, the _ is convention for internal names */ 

dòng của bạn được tuyên bố một "Danh sách struct" mà không được định nghĩa được nêu ra.

Các câu trả lời khác khá chính xác về. vs -> issue

Các vấn đề liên quan