Вот два способа выделить ваш 2D-массив:
cell *(*p_cell)[height][width] = malloc(sizeof(*p_cell));
p_cell
является указателем на двумерный массив указателей на cell
объектов. Пункт в точке с координатами i
, j
извлекается с помощью:
cell *p = (*p_cell)[i][j];
Это, вероятно, легче сделать p_cell
указатель на массив массивов:
cell *(*p_cell)[][width] = malloc(height * sizeof(*p_cell));
Вы бы получить пункт в точке с координатами i
, j
с
cell *p = p_cell[i][j];
Вышеуказанные массивы неинициализированы, вам необходимо будет инициализировать м с указателями на существующие cell
объектов или указателей на выделенные cell
объектов.
Если 2D массив используется только локально в функции и размеры width
и height
не слишком велики, вы можете определить 2D массив с локальным хранилищем:
cell *p_cell[height][width];
Как width
и height
динамические значения, статическая инициализация недоступна. Вы должны инициализировать этот массив с помощью вложенного цикла, как и выделенные.
Вопрос: Вам действительно нужен тип элемента, который должен быть указателем на cell
?. Это полезно только в том случае, если вы хотите, чтобы некоторые из этих указателей указывали на один и тот же объект или имели нулевое значение, или указывали на объекты cell
, упомянутые в другом месте. В противном случае, было бы гораздо проще использовать массив cell
объектов, либо локальными по отношению к функции или выделяется malloc()
или calloc()
:
cell p_cell[][width] = calloc(sizeof(*p_cell), height);
'клеток * p_cell [высота] [ширина] = таНос (высота * ширина * sizeof (cell *)); 'недействителен C, поэтому не может этого использовать. Возможно, вы думаете: «cell (* p_cell) [height] [width] = malloc (height * width * sizeof (cell *));'? Не зная целей приложения, «лучший способ» не заметен без широкого обсуждения. – chux
Эта ячейка p_cell [height] [width]; 'уже выделяет массив указателей размера' height'x'width' в 'cell', а именно' p_cell'. – alk