2017-04-03 78 views
1

我的意圖是創建一個多維的結構數組。然而,問題是它需要是一個全局變量,但我不知道編譯時的大小(這是用戶輸入)。構造和多維數組全局聲明C

可以說我有一個結構,像這樣:

typedef struct abc abc; 
struct abc { 
    int test; 
    char* color; 
}; 

我需要聲明一個全球性的多維數組這一點。

abc** board; 

在後面的代碼中的函數,然後,我想用值初始化大小並填寫:

board[height][width]; 

for(int i = 0; i < height; i++) { 
    for(int x = 0; x <width; x++) { 
     board[i][x].test = 0; 
    } 
} 

我要去哪裏錯了?看起來這部分是問題:board [height] [width]?

+0

'abc **板;'在陣列附近無處。 –

+0

好的,你能解釋爲什麼嗎? @SouravGhosh – Alex

+0

因爲數組不是指針,反之亦然。 –

回答

0

有兩種方法可以做到這一點。第一階段在兩種情況下都是相同的:爲abc分配一個指針數組(假設用戶已經輸入了高度和寬度的值,並且已經驗證了它們)。

board = calloc(height, sizeof *board); 

現在你有height空指針(純粹主義者會說這不是由C標準保證的,但我們會忽略它們,因爲它並不重要)的陣列。

現在,任你分配的width結構

for (size_t i = 0 ; i < height ; ++i) 
{ 
    board[i] = calloc(width, sizeof **board); 
} 

或者height陣列您alllocate整個事情一個巨大的陣列和在板指針置於右側偏移。

abc *temp = calloc(width * height, sizeof *board); 

for (size_t i = 0 ; i < height ; ++i) 
{ 
    board[i] = &temp[i * width]; 
} 

採用calloc意味着每個結構將已經具有零位模式,這意味着在大多數平臺上,test將爲0和color將是陣列中的每一個abc一個空指針被初始化。

如果您需要進行大量分配或者如果height可能很大,第二個選項會更加不透明但更高效。取消分配也更容易,只需要撥打free()

關於釋放的問題,如果這個全局數組只分配一次並且有整個程序的生存期,那麼當程序沒有被釋放時,所有內存都會返回到操作系統,無論如何終止(除非你是在一個嵌入式平臺或沒有虛擬內存的復古環境)

0

通過@xing

malloc的回答可被用於分配內存到板和它可能使用板[X] [Y]符號

板= malloc的(高度*的sizeof被訪問(*板) );然後在循環中分配內存作爲board [i] = malloc(width * sizeof(** board));.該結構還有一個char *,需要分配