最近有人向我提出了一个问题,需要在ANSI C中实现动态分配二维数组的功能。这个问题的解决方案相对简单,但需要注意一些细节。
基本思路是首先创建一个指针数组,然后为每个指针分配连续的内存空间。具体步骤如下:
1. 定义一个指向指针的指针,例如:char **p
。
2. 动态分配指针数组,即二维数组的行:p = (char **)calloc(row, sizeof(char *))
。
3. 为每个指针分配列空间:p[i] = (char *)calloc(col, sizeof(char))
。
下面是一个示意图,帮助理解这一过程:
需要注意的是,在测试过程中,直接将字符串赋值给指针(如:p[0] = "1111111111";
)会导致段错误,因为这实际上是将指针指向了一个静态字符串,而不是动态分配的内存。正确的做法是使用strcpy
函数将数据复制到动态分配的内存中。
以下是完整的代码示例:
#include "dynamic_allocate_array.h"
char **array_new(int row, int col) {
int i = 0;
char *ParrayCol = NULL;
char **ParrayRow = NULL;
ParrayRow = (char **)calloc(row, sizeof(char *));
for (i = 0; i
#include
#include
char **array_new(int row, int col);
void array_free(char **p, int row, int col);
#endif
#include "dynamic_allocate_array.h"
int main(void) {
char **p;
char *a[2];
char tab1[] = "1111111111111";
char tab2[] = "22222222222222222222";
char tab3[2][100] = {{"111111111111111111111111"}, {"2222222222222222222222222222"}};
a[0] = tab1;
a[1] = tab2;
p = array_new(2, 100);
strcpy(p[0], tab1);
strcpy(p[1], tab2);
printf("%s, strlen = %d\n", p[0], strlen(p[0]));
printf("%s, strlen = %d\n", p[1], strlen(p[1]));
p[1][5] = 0;
array_free(p, 2, 100);
p = array_new(2, 100);
strcpy(p[0], tab2);
return EXIT_SUCCESS;
}
通过上述方法,可以有效地管理和释放动态分配的二维数组内存,避免内存泄漏和其他常见错误。