【问题标题】:How do I dynamically allocate a 2d array of chars?如何动态分配二维字符数组?
【发布时间】:2016-04-01 11:08:12
【问题描述】:

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

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

char lines[numlines][maxlinelength];

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

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

【问题讨论】:

  • arr = malloc(numlines[star]maxlinelength[star]sizeof(char));

标签: c arrays multidimensional-array char malloc


【解决方案1】:

使用指向数组的指针:

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

这要求最里面的大小maxlinelength 是恒定的。

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

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

(澄清一下:sizeof( *lines )sizeof( char[maxlinelength] ) 相同)

【讨论】:

    【解决方案2】:

    试试这个代码:

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

    这会给你一个指向指针的指针,但是你可以把它当作一个二维数组来处理。

    另请参阅this very useful link,以了解二维数组的动态分配在内存中的实际作用。

    【讨论】:

    • 那不是二维数组。它是一个指向一维数组的指针数组。
    • @MartinJames 但动态分配二维数组的唯一方法是实际分配双指针..
    • @Marievi:这是错误的!你可以有int (*p)[varcols] = malloc(...);
    • @Olaf - 我没有写这个答案。我不同意你的观点,即只有一个正确答案(你所倡导的那个),而其他所有答案都是错误的。使用每一种可能的解决方案,都可以找到一个显示与实际二维数组不同的测试用例。
    • 我不同意。您正在驳斥任何不符合您狭隘观点的事物,因此我没有必要进一步讨论。
    【解决方案3】:

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

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

    【讨论】:

    • 这个问题是lines[i]没有指向char的数组(的第一个字符),所以lines[i][j]不能像访问二维数组一样工作.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-03
    • 2013-11-24
    相关资源
    最近更新 更多