недопустимое применение 'sizeof' к неполной структуре списка типов C

Я пытаюсь реализовать алгоритм замены, который имеет дело с ошибками страниц. Итак, я пытаюсь создать круговой связанный список с помощью malloc, и я получаю следующую ошибку: «Недопустимое приложение sizeof' to incomplete typepageInMemory». Ниже приведен код:

 typedef  struct {

            int use; 
            int reference;
            int free;
            struct pageInMemory* next;
            } pageInMemory;


            int main()
            {

                int i;
                struct pageInMemory* start, *nn, *temp, *hand;
                start = NULL;

                    for(i=0; i< pNum; i++) 
                    {
                nn = (struct pageInMemory *)malloc(sizeof(struct pageInMemory));
                        nn->use = 0;
                        nn->free = 1;

                        if(start==NULL)
                        {
                            nn->next = nn;
                            start =nn;
                        }

                        else
                        {     // sfhsdifhsdifj sdijfjsd 
                            temp = start;
                            while(temp->next != start)
                            {
                                temp = temp->next; 
                            }

                            temp->next = nn;
                            nn->next = start;
                            start = nn;

                        }   

                    }



                hand = start;
                temp = start;

             while(temp->next != start->next)
             {
                printf("%d\n", temp->use); //hi
             } 


                return 0;// bye
             }  

так что я не должен использовать malloc таким образом?


person joseph    schedule 20.06.2013    source источник
comment
Когда вы делаете typedef, я предлагаю вам следующий синтаксис: typedef struct foo { ... } foo; Это более ясно.   -  person Shar    schedule 20.06.2013


Ответы (3)


измените определение структуры как

struct pageInMemory{

            int use;
            int reference;
            int free;
            struct pageInMemory* next;
            };

чтобы ваш код работал. И просто для вашей информации не вводите тип void* из malloc.

person Dayal rai    schedule 20.06.2013
comment
Большое спасибо. Я сохранил тот же код и просто переопределил стойку так, как вы предложили, и это сработало. Спасибо - person joseph; 20.06.2013

pageInMemory сам определяется как тип. Итак, вместо этого

nn = (struct pageInMemory *)malloc(sizeof(struct pageInMemory))

Использовать это,

nn = (pageInMemory *)malloc(sizeof(pageInMemory))
person VoidPointer    schedule 20.06.2013

Это должно быть либо:

typedef  struct pageInMemory_s {

        int use; 
        int reference;
        int free;
        struct pageInMemory_s * next;
        } pageInMemory;

pageInMemory* start, *nn, *temp, *hand;
... 
nn = malloc(sizeof(pageInMemory));

or

struct pageInMemory {

        int use; 
        int reference;
        int free;
        struct pageInMemory* next;
        };

struct pageInMemory* start, *nn, *temp, *hand;
... 
nn = malloc(sizeof(struct pageInMemory));

Третий вариант:

typedef  struct pageInMemory {

        int use; 
        int reference;
        int free;
        struct pageInMemory * next;
        } pageInMemory;

pageInMemory* start, *nn, *temp, *hand;
... 

Для этого третьего варианта вы можете использовать:

nn = malloc(sizeof(pageInMemory));

or

nn = malloc(sizeof(struct pageInMemory));

Этот последний вариант меня очень раздражает, так как есть одно название для двух разных вещей:

  • Определение/декларация структуры struct pageInMemory
  • Определение/объявление типа pageInMemory

Я бы рекомендовал использовать не этот 3-й вариант, а второй.

person alk    schedule 20.06.2013
comment
Третий вариант получил одно и то же имя для двух разных вещей только потому, что вы назвали их так. Я лично считаю, что это лучший вариант, но вы должны сделать typedef struct pim { ...struct pim* next; } pageInMemory. И затем везде в коде использовать pageInMemory и делать вид, что такой вещи, как struct pim, не существует. Тогда ваш тип ведет себя согласованно со всеми другими типами языка. Например, вы можете написать node.next = malloc(sizeof(pageInMemory));, и все будет работать нормально. - person Lundin; 20.06.2013