如何动态分配2d字符数组?

我想动态分配一个二维数组来存储字符串。

我最初声明这个数组是这样的:

char lines[numlines][maxlinelength]; 

然而,当numlines非常庞大时,这会给我一个堆栈溢出。

如何动态分配它以防止堆栈溢出?

试试这段代码:

 char **arr; int i; arr = malloc(numlines*sizeof(char*)); for (i = 0; i < numlines; i++) arr[i] = malloc(maxlinelength*sizeof(char)); 

这将为您提供指向指针的指针,但您可以像处理2D数组一样处理它。

另请参阅此非常有用的链接 ,以了解2Darrays在内存中实际执行的动态分配。

使用指向数组的指针:

 #define maxlinelength 10 char (*lines)[maxlinelength] = malloc( sizeof( char[maxlinelength] ) * numlines ) ; lines[0][0] = 'A' ; 

这要求内部最大尺寸maxlinelength是恒定的。

如果使用指向可变长度数组的指针,则可以避免此限制,在这种情况下,语法保持不变,并且maxlinelength不必是常量。 支持此function的标准是C99和可选的C11。

常量是一个变量,其值在编译时是已知的。)

(并澄清: sizeof( *lines )sizeof( char[maxlinelength] )

 char **lines = malloc(numlines * sizeof(*lines)); *lines = malloc(numlines * maxlinelength * sizeof(**lines)); size_t i; for (i = 1 ; i < numlines ; ++i) { lines[i] = *lines + i * maxlinelength; } 

首先,分配数组,然后分配所需的所有内存,然后将正确的地址放在“主”数组的每个槽中。

您可以使用以下内容分配连续的内存块:

 const int numlines = 10; const int maxlinelength = 120; const int arrlen = sizeof(char) * numlines * maxlinelength; const char **lines = (const char**)malloc(arrlen); fprintf(stderr, "Allocated %d bytes\n", arrlen); 

根据口味添加/删除const和类型转换。