Используя malloc для выделения многомерных массивов с различными длинами строки

У меня есть следующее C код:

int *a;
size_t size = 2000*sizeof(int);
a = (int *) malloc(size);

который хорошо работает. Но если у меня есть следующее:

char **b = malloc(2000*sizeof *b);

где каждый элемент b имеет другую длину.

Как возможно сделать то же самое для b поскольку я сделал для a; т.е. следующий код содержал бы корректный?

char *c;
size_t size = 2000*sizeof(char *);
c = (char *) malloc(size);
66
задан Ciro Santilli 新疆改造中心法轮功六四事件 2 April 2016 в 11:25
поделиться

4 ответа

Сначала необходимо выделить массив указателей типа char **c = malloc( N * sizeof( char* )), затем выделить каждую строку отдельным вызовом на malloc, возможно в цикле:


/* N is the number of rows  */
/* note: c is char** */
if (( c = malloc( N*sizeof( char* ))) == NULL )
{ /* error */ }

for ( i = 0; i < N; i++ )
{
  /* x_i here is the size of given row, no need to
   * multiply by sizeof( char ), it's always 1
   */
  if (( c[i] = malloc( x_i )) == NULL )
  { /* error */ }

  /* probably init the row here */
}

/* access matrix elements: c[i] give you a pointer
 * to the row array, c[i][j] indexes an element
 */
c[i][j] = 'a';

Если известно общее количество элементов (e. g. N*M), то это можно сделать за одно распределение.

.
77
ответ дан 24 November 2019 в 14:52
поделиться

Если каждый элемент в b имеет разную длину, то вам нужно сделать что-то вроде:

int totalLength = 0;
for_every_element_in_b {
    totalLength += length_of_this_b_in_bytes;
}
return (char **)malloc(totalLength);
3
ответ дан 24 November 2019 в 14:52
поделиться

Типичная форма динамического выделения массива NxM типа T -

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

Если каждый элемент массива имеет разную длину, то замените M на соответствующую длину этого элемента; например

T **a = malloc(sizeof *a * N);
if (a)
{
  for (i = 0; i < N; i++)
  {
    a[i] = malloc(sizeof *a[i] * length_for_this_element);
  }
}
49
ответ дан 24 November 2019 в 14:52
поделиться

Я думаю, что 2-ступенчатый подход лучше, потому что c 2-d массивы - это просто массивы и массивы. На первом этапе нужно выделить один массив, а затем по мере продвижения по нему циклически выделять массивы для каждого столбца. В этой статье приведены хорошие подробности.

.
2
ответ дан 24 November 2019 в 14:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: