2014-10-24 9 views
0

У меня есть следующий массив с описанием игрового поля:Как malloc() многомерный массив нестандартного типа?

square * board = (square *)malloc(sizeof(square)*n*n); 

Как я могу инициализировать такой массив с его элементами, указывающими на дальнейшие игры брусьев выше декларации?

То есть, я хочу инициализировать фрагменты всего массива board; как так (псевдокод):

boards[0] -> [0,0,...0] 
boards[1] -> [0,0,...0] 
boards[2] -> [0,0,...0] 

я должен использовать malloc() выделить массив доски.

Я уже пробовал так:

square (*t_board)[11]; 
t_board = malloc(sizeof(player)*n*n*11); 

Но я получил ошибку: «использование незаявленных Indentifier„t_board“, Вы имели в виду„доска“»

+0

Это хорошо. У вас возникли вопросы? –

+0

спасибо за редактирование, пожалуйста, напишите anwser, если у вас есть – gen

+0

подобное сообщение http://stackoverflow.com/questions/1970698/using-malloc-for-allocation-of-multi-dimensional-arrays-with-different-row -lengt –

ответ

1

Сначала выделите память для массива с помощью указателей, а затем плат.

square **boards; 
int nbr_boards = 5; 
int n = 24; 

//Allocate space for pointers 
boards = malloc(nbr_boards * sizeof *boards); 

//Allocate space for each board 
for (int i = 0; i < nbr_boards; ++i) 
     boards[i] = malloc(n * n sizeof **boards); 

Вы можете использовать это как

boards[BOARD_INDEX][SQUARE_INDEX] 

Чтобы впоследствии освободить его, вы должны проходным указатели снова:

for (int i = 0; i < nbr_boards; ++i) 
     free(boards[i]); 
free(boards); 
1

Вне зависимости от типа распределения массива N х N принимает одну из следующих форм:

Если N известно во время компиляции, или если массивы переменной длины поддерживаются, это легко:

T (*arr)[N] = malloc(sizeof *arr * N); 

Элементы доступны как arr[i][j]. Когда вы закончите, вы бы освободить их

free(arr); 

Если N не известно во время компиляции и Власа не поддерживаются и все элементы массива должны быть смежными, то вам нужно выделить 1D массив и вычислить смещение:

T *arr = malloc(sizeof *arr * N * N); 
... 
x = arr[ i * N + j ]; 

Если элементы массива не должны быть смежными, вы можете сделать выделение кусочным:

T *arr = malloc(sizeof *arr * N); 
if (arr) 
{ 
    for (size_t i = 0; i < N; i++) 
    { 
    arr[i] = malloc(sizeof *arr[i] * N); 
    } 
} 

Вы бы этот массив в качестве arr[i][j], но так как вы выделили его кусочно, вы должны освободить его таким же образом:

for (size_t i = 0; i < N; i++) 
    free(arr[i]); 
free(arr); 

Если вы хотите, чтобы инициализировать элементы массива для всех бит-0, использовать calloc вместо из malloc:

T (*arr)[N] = calloc(N, sizeof *arr); 

Если вы хотите, чтобы инициализировать элементы массива на что-то другое, чем все-бит нуля, то, что зависит от того, что T выглядит.Если T, скажем, тип структуры, содержащей два целочисленных элементов, и вы используете C99 или более поздней версии компилятора, вы можете использовать соединение буквального в сочетании с memcpy:

memcpy(arr[i], (struct foo []){ {1,2}, {3,4}, {5,6}, {7,8} ... }); 
+0

+1 Написал ответ, который я бы хотел - спас мне время. Незначительная идея стиля: возможно, 'malloc (N * sizeof * arr)' vs. 'malloc (sizeof * arr * N)', поскольку он соответствует порядку 'nmemb, size'' calloc (N, sizeof * arr) '. Разумеется, те же самые результаты распределяются с помощью 'malloc()' независимо от того, как формируется продукт. – chux

Смежные вопросы