2D char数组的动态内存

Ank*_*kur 7 c memory-management

我已经声明了一个数组char**arr; 如何初始化2D char数组的内存.

小智 9

一种方法是执行以下操作:

char **arr = (char**) calloc(num_elements, sizeof(char*));

for ( i = 0; i < num_elements; i++ )
{
    arr[i] = (char*) calloc(num_elements_sub, sizeof(char));
}
Run Code Online (Sandbox Code Playgroud)

很清楚这里发生了什么 - 首先,你正在初始化一个指针数组,然后对于这个数组中的每个指针,你要分配一个字符数组.

你可以将它包装在一个函数中.在使用之后你也需要释放()它们,如下所示:

for ( i = 0; i < num_elements; i++ )
{
    free(arr[i]);
}

free(arr);
Run Code Online (Sandbox Code Playgroud)

我认为这是最简单的方法,可以满足您的需求.


Ale*_*min 8

分配类型数组有两种选择 char **

我已经从comp.lang.c FAQ中转录了这两个代码示例(其中也包含了这两种数组类型的一个很好的例证)

选项1 - 每行一个分配加一个行指针.

char **array1 = malloc(nrows * sizeof(char *)); // Allocate row pointers
for(i = 0; i < nrows; i++)
  array1[i] = malloc(ncolumns * sizeof(char));  // Allocate each row separately
Run Code Online (Sandbox Code Playgroud)

选项2 - 将所有元素分配在一起并分配行指针:

char **array2 = malloc(nrows * sizeof(char *));      // Allocate the row pointers
array2[0] = malloc(nrows * ncolumns * sizeof(char)); // Allocate all the elements
for(i = 1; i < nrows; i++)
  array2[i] = array2[0] + i * ncolumns;
Run Code Online (Sandbox Code Playgroud)

您也可以只分配一个内存块并使用一些算法来获取元素[i,j].但是你会使用a char*而不是char**代码变得复杂.例如,arr[3*ncolumns + 2]而不是arr[3][2]