使用 malloc 分配不同行长的多维数组

使用 malloc 分配不同行长的多维数组

问题描述:

我有以下 C 代码:

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

效果很好.但如果我有以下几点:

which works fine. But if I have the following :

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

其中 b 的每个元素都有不同的长度.

where every element of b has different length.

如何对 b 做和我对 a 做的一样的事情;即以下代码是否正确?

How is it possible to do the same thing for b as i did for a; i.e. the following code would hold correct?

char *c;
size_t size = 2000*sizeof(char *);
c = (char *) malloc(size);

首先,您需要像 char **c = malloc( N * sizeof( char* )) 一样分配指针数组,然后通过对 malloc 的单独调用分配每一行,可能在循环中:

First, you need to allocate array of pointers like char **c = malloc( N * sizeof( char* )), then allocate each row with a separate call to malloc, probably in the loop:


/* 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';

如果您知道元素的总数(例如 N*M),您可以在一次分配中完成此操作.

If you know the total number of elements (e.g. N*M) you can do this in a single allocation.