2013-06-20 35 views
2

我試圖實現一個處理頁面錯誤的替換算法。所以我想用malloc來創造一個循環鏈表,並即時得到以下錯誤:「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 
      } 

所以我是不應該使用malloc這樣?

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

對於這個第三選項,您可以使用:

nn = malloc(sizeof(pageInMemory)); 

nn = malloc(sizeof(struct pageInMemory)); 

後者的變化,我覺得是很討厭的,因爲是一個名字兩個不同東西:

  • 結構定義/聲明struct pageInMemory
  • 類型定義/聲明pageInMemory

我不建議使用此選項3,但第二。

+0

第三個選項因爲你以這種方式命名它而獲得了兩個不同事物的相同名稱。我個人認爲這是最好的選擇,但你應該做'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