2010-09-22 183 views
1

編譯器在函數結尾處獲得賦值時發生指針預期錯誤。爲什麼?爲什麼malloc失敗?

(去掉石膏和代碼索引符號;他們在那裏的「調試」買顯然堆滿我的問題。)

int createArraySimple(int initialResetCount, int ***array) 
{ 
    int sourceTermIndex, driveCurrentIndex, preEmphasisIndex, freqIndex, voltageIndex, slicerIndex, biasIndex; 
    int dataIndex, dataCount = 3; 

    *array = malloc(2*sizeof(int**));          // sourceTerm 
    if (*array == NULL) 
     return 0; 
    for (sourceTermIndex=0; sourceTermIndex < 2; sourceTermIndex++)     
    { 
     *((*array)+sourceTermIndex) = malloc(2*sizeof(int*));       // drive current 
     if (*((*array)+sourceTermIndex) == NULL) 
      return 0; 
     for (driveCurrentIndex=0; driveCurrentIndex < 2; driveCurrentIndex++) 
     { 
      *((*((*array)+sourceTermIndex))+driveCurrentIndex = malloc(2*sizeof(int)); // pre-emphasis 
      if (*((*((*array)+sourceTermIndex))+driveCurrentIndex) == NULL) 
       return 0; 
     } 
    } 

    //'initialize elements in array, since if they are not updated, we won't print them 
    for (sourceTermIndex = 0; sourceTermIndex < 2; sourceTermIndex++) 
     for (driveCurrentIndex = 0; driveCurrentIndex < 2; driveCurrentIndex++) 
      for (preEmphasisIndex = 0; preEmphasisIndex < 2; preEmphasisIndex++) 
       *((*((*((*array)+sourceTermIndex))+driveCurrentIndex))+preEmphasisIndex) = initialResetCount; 
         return 1; 
} 
+1

哇。它的代碼就像這樣可以讓C#成爲一個非常開心的地方。如果我不得不使用這個,我可能會使用一個緩衝區分配,並完成數組[]自己的數學運算,以確保一切正確。 – 2010-09-22 20:29:04

+5

它是全明星! – nategoose 2010-09-22 20:40:48

+6

男人,只是不要發佈'createArrayComplicated'。我認爲我不能接受那個。 – 2010-09-22 20:45:45

回答

2

*array讓你一個int** - 這相當於array[0]。所以(*array)[x]給你一個int*(*array)[x][y]給你一個普通的int。然後你嘗試在這個int上使用數組索引操作符,編譯器說:「哇,那不是指針!」

我想你的意思只是寫array而不是*array

1
(*array)[][][] = ... 

有一個

int ***array 

反引用的層次太多。如果你想有一個指針指向一個二維數組,你需要

(*array)[][] = ... 
5

int ***array是一個指針,指針指向int的指針。

(*array)是指向int的指針。

(*array)[sourceTermIndex]是一個指向int的指針。

(*array)[sourceTermIndex][driveCurrentIndex]是一個int。

(*array)[sourceTermIndex][driveCurrentIndex][preEmphasisIndex]是取消引用一個int,這是不可能的,因此錯誤消息。

這兩個數組都是一個in參數,它不應該被賦值,或者你希望它是一個out參數,它是一個指向指向int的指針的指針,所以使它成爲一個四星指針。

你也有一個malloc的鑄造爲int:

(int)malloc(2*sizeof(int)); // pre-emphasis 

不要做,它只是隱藏錯誤的左手應該是一個指針。早期的錯誤更好; malloc的結果非常罕見需要被轉換。