2017-02-12 6 views
4

В настоящее время я пишу функцию, которая использует двумерный массив указателей на структуру cell. Мне нужно будет обновить каждый cell данными, считываемыми в файле. Поскольку мне нужно будет получить доступ к различным ячейкам, мне приходится иметь дело с динамическим распределением. Но каков наилучший способ использовать его здесь, поскольку мне не нужен доступ к самому массиву? Могу ли я использовать:Двумерный массив указателей

cell *p_cell[height][width] = malloc(height*width*sizeof(cell*)); 

Или:

cell *p_cell[height][width]; 

, а затем позже (в цикле, например):

p_cell[i][j] = malloc(sizeof(cell*)); 
+1

'клеток * p_cell [высота] [ширина] = таНос (высота * ширина * sizeof (cell *)); 'недействителен C, поэтому не может этого использовать. Возможно, вы думаете: «cell (* p_cell) [height] [width] = malloc (height * width * sizeof (cell *));'? Не зная целей приложения, «лучший способ» не заметен без широкого обсуждения. – chux

+1

Эта ячейка p_cell [height] [width]; 'уже выделяет массив указателей размера' height'x'width' в 'cell', а именно' p_cell'. – alk

ответ

2

Похоже, вы хотите 2D массив указателей, которые могут быть объявлены как:

cell *p_cell[height][width]; 

Чтобы выделить каждый из этих cell * указателей в p_cell[i][j], вы можете сделать это:

for (size_t i = 0; i < height; i++) { 
    for (size_t j = 0; j < width; j++) { 
     p_cell[i][j] = malloc(sizeof(cell)); 
     /* check malloc */ 
     /* access using p_cell[i][j]->something */ 
    } 
} 
+0

Спасибо! Это именно то, чего я хотел. У меня было огромное количество ошибок памяти на Valgrind, без каких-либо ошибок с вашим решением! – narfi

4
data_type (*array) [width] = malloc(sizeof(data_type[height][width])); 

Теперь вы можете получить доступ к данным используя arr[i][j]

PS: 2-D a rray следует выделять как непрерывный кусок памяти, чтобы получить лучшую производительность чтения.

** Редактировать: ** Как указано chux в разделе комментариев, array не является 2-мерным массивом, это указатель на 1-мерный массив.

Чтобы сделать array в качестве 2-мерного массива, вам необходимо объявить его следующим образом.

data_type (*array) [height][width] = malloc(sizeof(data_type[height][width])); 
+1

'array' не является 2-мерным массивом, а указателем на 1-мерный массив. – chux

+1

* всегда * слишком сильное слово, когда дело доходит до программирования. В том, что мы делаем, нет абсолютов. Различные платформы будут иметь разные ограничения. – StoryTeller

+0

@chux: Правильно, это указатель на 1-мерный массив. Теперь я отредактировал свой ответ. – Shravan40

2

Вот два способа выделить ваш 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); 
Смежные вопросы