2013-05-01 96 views
2

我已經閱讀了一些類似的問題,但我仍然無法看到我要出錯的地方。當初始化結構數組時出現錯誤(不兼容的類型)

我的malloc的指針和,似乎工作不錯,但我在這條線得到一個錯誤(不兼容類型):

canArray [i] = (TinCan *) malloc(sizeof(TinCan)) 

下面是完整的代碼:

typedef struct TinCan 
{ 
    int date; 
    int time; 
} TinCan; 

int main() 
{ 
    int i; 
    TinCan *canArray = malloc(10 * sizeof(TinCan)); 

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

回答

4

猜你有一個typedef struct {...} TinCan;的地方,然後在這裏:

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

你有足夠的空間用於10層TinCan結構,但在這裏:

canArray [i] = (TinCan *) malloc(sizeof(TinCan)); 

您正試圖爲另一個空間分配空間TinCan結構。

你想:

  1. TinCan秒的陣列?如果是這樣,則不需要循環 - 當您詢問時空間已被分配10 * sizeof(TinCan)

  2. 指向TinCan結構體的指針數組?如果是,請將第一行更改爲:

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

    並保持循環。


一些一般性的評論:

  • 你不需要malloc()呼叫前投 - 見 - Do I cast the result of malloc?

  • 它使用sizeof(varname[0])很好的做法,而不是​​,以避免(或更明顯)愚蠢的錯誤。

  • 與電流回路代碼,您將離開最後TinCan未初始化 - 你在canArray創建10個條目,但只有初始化其中9 i < 9。更改爲i < 10,或額外的信用,換出一個#define NUMBER_OF_CANS 10

+0

謝謝,我明白了。如果我現在要將該數組傳遞給初始化方法,它會是這樣嗎? intitialise(canArray **)?這不適合我。 – Dawson 2013-05-01 06:46:38

+1

沒關係。你可以有一個函數初始化一個數組或一個指針數組。我可能會採用第一種方法(指向10個TinCan的指針),因爲代碼會更清晰。 – 2013-05-01 06:48:43

+1

此外,重要的是要記住,數組和指針是不一樣的 - 如果這聽起來很混亂,請閱讀http://c-faq.com/aryptr/aryptr2.html – 2013-05-01 06:50:52

3

你有聲明瞭一個TinCan結構體的數組,但是你的循環表明你需要一個指向TinCan結構體的指針數組。

變化canArray的聲明:

TinCan *canArray[] = malloc(10 * sizeof(TinCan*)); 
相關問題