2015-04-18 127 views
1

我可以在C中做這個嗎?在結構中聲明2D數組而不知道結構中的大小?

我有這樣的代碼,讓我的錯誤

ERROR 
minesweeper.c:19:19: error: expected ‘:’, ‘,’, ‘;’, ‘}’ or ‘__attribute__’ before ‘=’ token 
     int *boardSpaces = (int *)malloc(newBoard.rows * newBoard.columns * sizeof(int)); 

typedef struct boards 
{ 
    int rows, columns; 
    int *boardSpaces = malloc(rows * columns * sizeof(int)); 
} Board; 

但是,當我把它放在我的主要它工作得很好。

我可以在結構體中聲明它,還是僅僅是我錯過了某些東西?

+2

不,它是無效的。在C中,你不能在結構定義中有任何成員初始化器。 – kaylum

+0

如果你喜歡,你可以告訴我們你想達到什麼目標,有人可能會幫助你。 – kaylum

回答

2

你不能在結構中的變量上運行函數。

簡短的答案是因爲rowscolumns在編譯時沒有任何值。

你可以這樣做,在這個函數中,create_board和delete_board本質上是模仿C++的構造函數和析構函數,但是你必須手動調用它們。

struct Board 
{ 
    int rows, columns; 
    int *boardSpaces; // memory will be allocated when we need it 
}; 

/* create a board with a given size, as memory is dynamically allocated, it must be freed when we are done */ 
struct Board createBoard(int rows, int columns){ 
    struct Board b; 
    b.rows = rows; 
    b.columns = columns; 
    b.boardSpaces = malloc(rows * columns * sizeof(int)); 
    return b; 
} 
void delete_board(Board *b){ 
    free(b->boardSpaces); 
} 

int main(void){ 
    struct Board b = createBoard(2,3); 
    do_stuff_with(&b); 
    delete_board(&b); 

} 

/*我沒有通過編譯器運行它,所以請原諒錯別字*/

+0

返回初始化結構是不好的風格。即使是C++構造函數也不這樣做。更好地使用指向由調用方分配的結構的指針,並返回可能報告內存分配失敗的成功/失敗指示符。 – chqrlie

+0

@chqrlie:我不會否認這一點,但是這給出瞭如何擁有這個結構的基本概念。通常在我工作的C應用程序中,任何內存失敗都是不可恢復的,所以我的一般過程是在函數的頂部創建結構,並將其指針作爲參數傳遞給返回0/1的設置函數,那麼,如果失敗,我會發出一條消息,並退出程序。 –

+0

您應該使用'calloc'來返回一致的初始化板。 – chqrlie