我想动态分配2d数组来存储字符串。
我最初宣布这个数组是这样的:
char lines[numlines][maxlinelength];
然而,当numlines非常庞大时,这会给我一个堆栈溢出。
如何动态分配它以防止堆栈溢出?
答案 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
并根据品味进行类型转换。