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

时间:2016-04-01 11:08:12

标签: c arrays multidimensional-array char malloc

我想动态分配2d数组来存储字符串。

我最初宣布这个数组是这样的:

char lines[numlines][maxlinelength];

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

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

3 个答案:

答案 0 :(得分:3)

使用指向数组的指针:

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

这要求最内部的大小maxlinelength是常量。

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

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

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

相同

答案 1 :(得分:1)

试试这段代码:

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

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

另请参阅this very useful link以了解2D阵列在内存中的实际动态分配。

答案 2 :(得分:-1)

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

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并根据品味进行类型转换。