У меня есть следующее 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);
Сначала необходимо выделить массив указателей типа 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
), то это можно сделать за одно распределение.
Если каждый элемент в b имеет разную длину, то вам нужно сделать что-то вроде:
int totalLength = 0;
for_every_element_in_b {
totalLength += length_of_this_b_in_bytes;
}
return (char **)malloc(totalLength);
Типичная форма динамического выделения массива 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);
}
}
Я думаю, что 2-ступенчатый подход лучше, потому что c 2-d массивы - это просто массивы и массивы. На первом этапе нужно выделить один массив, а затем по мере продвижения по нему циклически выделять массивы для каждого столбца. В этой статье приведены хорошие подробности.
.