storage size of ‘names’ isn’t known

77,116

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.

Share:
77,116
Wazery
Author by

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, 2022

Comments

  • Wazery
    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
    pmg over 13 years
    +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!)
  • Wazery
    Wazery over 13 years
    i have another error names_list.c:14: error: invalid type argument of ‘->’ (have ‘List’)
  • pmg
    pmg over 13 years
    @Sam: pointers take the -> shortcut to access members, plain structs access them with ..
  • John Bode
    John Bode over 13 years
    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.