2013-05-01 64 views
0

我聲明並嘗試初始化一個結構指針數組。它編譯沒有錯誤,但這個循環總是在8個迴路導致程序崩潰:初始化結構指針數組會導致奇怪的錯誤

for(ii = 0; ii < 10; ii++) 
    { 
    canArray[ii]->AC = 0; 
    printf("%d - AC is %d\n", ii, canArray[ii]->AC); 
    } 

整個代碼在這裏:

typedef struct Can 
    { 
    int AC; 
    } Can; 


int main (int argc, char* argv[]) 
    { 
     int i, ii; 

     Can **canArray= malloc(10 * sizeof(Can[0])); 

     for (i =0; i < 10; i++) 
      { 
      canArray[i] = (Can*) malloc(sizeof(Can)); 
      } 

     for(ii = 0; ii < 10; ii++) 
      { 
      canArray[ii]->AC = 0; 
      printf("%d - AC is %d\n", ii, canArray[ii]->AC); 
      } 

    } 
+0

你閱讀和理解的答案,你問前面的問題http://stackoverflow.com/questions/16313774/error-incompatible-types-when-initialising-struct- array/16313805#16313805? – 2013-05-01 09:21:00

回答

3

你有一些問題的內存分配。 您想爲Can結構的10個指針分配空間。但你做錯了。

Can **canArray= malloc(10 * sizeof(Can[0])); 

做這樣的:

Can **canArray= malloc(10 * sizeof(Can *)); 
+0

謝謝,解決了它。 – Dawson 2013-05-01 07:59:37

1

在這裏,你需要爲罐結構的指針10分配空間。 爲此,您需要編寫

Can ** canArray = malloc(10 * sizeof(Can *));

代替Can **canArray= malloc(10 * sizeof(Can[0]));

1

Can是一種類型的,並且Can[0]也是一種,雖然有些奇怪:它是一個零長度陣列。這實際上不是作爲獨立類型允許的,但編譯器將其作爲擴展。

無論如何,sizeof(Can[0])只是0

你不應該說裏面malloc類型。相反,使用該變量。這消除了冗餘。所以,你的代碼應該是:

Can **canArray = malloc(10 * sizeof canArray[0]); 

for (size_t i = 0; i != 10; ++i) 
{ 
    canArray[i] = malloc(sizeof canArray[i][0]); 
    canArray[i]->AC = 0; 
    printf("%zu - AC is %d\n", i, canArray[i]->AC); 
}