tags:

views:

71

answers:

3

I get this error while compiling this .c source file

/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;
int x = 0;
    for(; x < 3 ; x++){

        printf("Iteration.%d data: %d", x, pointer->data);
        pointer->next = pointer->next->next;
    }
}

and here is header of this linked list

#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
+1  A: 

struct List names; doesn't declare a pointer, but you're trying to dereference it (using ->). Use names.size instead.

Oli Charlesworth
+7  A: 

When you typedef a struct like that, you don't have to use struct when declaring it:

List names;

instead of

struct List names;

It's also not a pointer, so names->size should be names.size.

Nathon
+1 Just a comment to make it clearer: the `struct List` does not exist. There is a `struct _List` and a typedef `List` that identifies the same type as `struct _List`. *(I hate typedefs!)*
pmg
i have another error names_list.c:14: error: invalid type argument of ‘->’ (have ‘List’)
Sam
@Sam: pointers take the `->` shortcut to access members, plain structs access them with `.`.
pmg
Another point: identifiers that begin with an underscore and capital letter (such as _List) are reserved for use by the implementation (7.1.3) and should not be used in application code.
John Bode
+1  A: 

The struct is called _List. The typedef is List. So you want

 List names;

or

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

Your line is declaring a "struct List" which isn't defined yet.

The other answers are quite correct about the . vs -> issue

Paul