2011-11-13 64 views
2

main.h在C中定義結構數組?

#define DATA struct data 
DATA 
{ 
    int id; 
    char data; 
} 

的main.c

DATA *listOfData[100]; 

所以在這一點上,我會/應該可以在列表中這樣的訪問數據:

printf(listOfData[5]->data); 

它不是不讓我這樣做,運行只是凍結最後一次印刷f ...沒有錯誤或任何東西。

+4

不要隱藏的#define後面的關鍵字。你迷惑自己。 – wildplasser

+0

該定義是我的教授給我的框架/僞代碼的一部分 –

+7

好吧:告訴他停止這樣做! – wildplasser

回答

2

這是因爲你已經定義了一個指針數組。但是你從未初始化任何指針。

因此:

printf(listOfData[5]->data); 

將會崩潰(未定義的行爲),因爲你是在指數5

*取消引用(無效)指針(這就是定義一個struct一個非常奇怪的方式.. )

要解決此問題,您需要爲陣列中的每個指針分配。如果你不真正需要的是一個指針數組,那麼它可能是更好的只是使它的結構本身的數組:

DATA listOfData[100]; 

和訪問它:

listOfData[5].data 

然後你不必處理分配每個元素。

0

您尚未顯示DATA *的任何內存分配。要麼你的陣列聲明爲一個結構數據的數組,如:

DATA listOfData[100]; 

或動態分配內存並分配您的數組中的指針。

1

我不確定爲什麼printf只會凍結,但這有幾個問題。首先,您的DATA*陣列中的所有指針都未初始化。你可能是爲了使代替DATA指針數組的DATA數組,:

DATA listOfData[100]; 

您還沒有以分號結束的結構,所以它似乎不太可能,這甚至會編譯:

#define DATA struct data 
DATA 
{ 
    int id; 
    char data; 
}; 

最後,您以相當不安全的方式使用printf;第一個參數必須是一個格式字符串,或者你可以得到奇怪的行爲,如果第一個參數中有一個%

printf("%c\n", listOfData[5].data);