storage size of ‘names’ isn’t known
Solution 1
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
.
Solution 2
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
Solution 3
struct List names;
doesn't declare a pointer, but you're trying to dereference it (using ->
). Use names.size
instead.
Wazery
Software Engineer | ex-GSoCer《2012》| GSoC 2013 Mentor | KDE Developer | Ubuntu Official Member | Rails Contributor | CS Graduate | Fan of {OpenSource, SciFi, Tennis, Electro Music}. Areas of familiarity: Web Programming (Ruby on Rails, CSS, HTML, JavaScript) C/C++ Qt Linkedin: wazery Github: wazery Twitter: wazery_ http://stackexchange.com/users/flair/98894.png
Updated on July 09, 2022Comments
-
Wazery almost 2 years
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; for(int x = 0; 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
-
pmg over 13 years+1 Just a comment to make it clearer: the
struct List
does not exist. There is astruct _List
and a typedefList
that identifies the same type asstruct _List
. (I hate typedefs!) -
Wazery over 13 yearsi have another error names_list.c:14: error: invalid type argument of ‘->’ (have ‘List’)
-
pmg over 13 years@Sam: pointers take the
->
shortcut to access members, plain structs access them with.
. -
John Bode over 13 yearsAnother 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.