如何在运行时分配多维数组?

Posted

技术标签:

【中文标题】如何在运行时分配多维数组?【英文标题】:How can allocate multi dimensional array at run time? 【发布时间】:2012-09-01 07:32:45 【问题描述】:

在设计时我可以像这样声明一个变量:

char szDesignTimeArray[120][128];

上面的声明是120个大小为128的数组。在运行时我需要分配以下内容:

char szRunTime[?][128];

我知道数组的大小,但我不知道需要分配多少个数组。知道号码后如何申报和分配?

感谢所有

【问题讨论】:

C99 可用吗?那么变长数组可能是最简单的了。 ***.com/questions/455960/… 【参考方案1】:

我假设在运行时您也知道 Row_Size。

可以在运行时动态分配多维数组,如下:

#include <stdlib.h>

int **array;
array = malloc(nrows * sizeof(int *));
if(array == NULL)
    
    fprintf(stderr, "out of memory\n");
    exit or return
    
for(i = 0; i < nrows; i++)
    
    array[i] = malloc(ncolumns * sizeof(int));
    if(array[i] == NULL)
        
        fprintf(stderr, "out of memory\n");
        exit or return
        
    

参考:

http://www.eskimo.com/~scs/cclass/int/sx9b.html

【讨论】:

请记住,释放子数组也很重要,而不仅仅是free(array); 这里不会用calloc 代替malloc 吗? 你将如何将此数组memcpy到另一个位置?您将如何使用 bsearch、qsort 等?哎呀。不要使用指针对指针的表示法,而是读取数组指针。【参考方案2】:

静态知道行长,也可以分配

char (*szRunTime)[128];
// obtain row count
szRunTime = malloc(rowCount * sizeof *szRunTime);

内存指向char[128]。这样,您将获得一个连续的内存块,这可能会提供更好的局部性,并且您只需要 free 一个指针。

如果行数不太大,使用变长数组,

rowCount = whatever;
char szRunTime[rowCount][128];

如果支持 C99 或更高版本,可能是最佳选择。

【讨论】:

这是迄今为止最好的解决方案。如果您使用错误的(但常见的)指针对指针表示法,您最终会在整个堆中的段中声明数组。这样的数组将与各种 C 库函数(mempcy、bsearch、qsort 等)不兼容。【参考方案3】:

使用这个,其中变量是你想要多少个数组:

char **szRunTime = malloc(sizeof(char *)*Variable);
int i;
for(i=0 ; i<Variable ; i++)
    szRunTime[i] = malloc(sizeof(char)*128);

【讨论】:

你将如何将此数组memcpy到另一个位置?您将如何使用 bsearch、qsort 等?哎呀。不要使用指针对指针的表示法,而是读取数组指针。

以上是关于如何在运行时分配多维数组?的主要内容,如果未能解决你的问题,请参考以下文章

java中多维数组如何构造索引?

在 laravel 中,如何将多维数组作为 artisan 命令的选项传递?

如何理解JS多维数组

多维数组指向多维数组

如何添加来自不同数组的多维数组值

如果数组存在于另一个多维数组中,如何从多维数组中删除该数组? [复制]