2013-06-20 1 views
2

Я пытаюсь реализовать алгоритм замены, который обрабатывает ошибки страницы. Так что я пытаюсь круговой создающим связанный список с помощью таНоса и им получить следующую ошибку: «недопустимое применение sizeof' to incomplete type pageInMemory'.following является код:Недопустимое приложение 'sizeof' для неполного списка типов struct C

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 
      } 

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

+0

Когда вы делаете typedef, я предлагаю вам этот синтаксис: typedef struct foo {...} foo; Это более понятно. – Shar

ответ

0

Оно должно быть:

typedef struct pageInMemory_s { 

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

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

или

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; 
... 

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

nn = malloc(sizeof(pageInMemory)); 

или

nn = malloc(sizeof(struct pageInMemory)); 

Последнее изменение я чувствую очень раздражает, поскольку есть одно имя для двух Разное штук:

  • Структура определения/декларация struct pageInMemory
  • Определение типа/декларация pageInMemory

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

+0

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

1

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

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

Используйте это,

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

изменить ваше определение, как структура

struct pageInMemory{ 

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

, чтобы получить код работает. И только для вашей информации do not typecast void* coming from malloc.

+0

Спасибо вам большое. Я сохранил тот же код и просто переопределил планку так, как вы ее предлагали, и это сработало. спасибо – joseph