在C中声明一个大小为26 ^ 5的5d数组

时间:2018-02-04 14:42:03

标签: c arrays

我的问题很简单。

我正在建立一个小程序来使用马尔可夫链分析和模拟随机文本。我的第一个MC有大小为2的内存,使用字母{a,b,...,z}。因此,我的转换矩阵大小为26 * 26 * 26.

但是现在,我想使用内存大小为4的MC来增强我的模拟。因此,我需要将转换概率存储在大小为26 * 26 * 26 * 26 * 26的5D阵列中

问题是(我相信),C不允许我声明和操纵这样的数组,因为它可能太大了。实际上,在写作时我得到了分段错误11 提示符:

  

int count [26] [26] [26] [26] [26]

有没有办法解决这个限制?

谢谢!

4 个答案:

答案 0 :(得分:5)

在具有32位整数的典型PC架构上,int count[26][26][26][26][26]创建一个大小为47525504字节,47MB的对象,这在大多数当前计算机上都是可管理的,但可能对于自动分配而言太大(又名在堆栈上)。

您可以将count声明为全局或静态变量,或者您可以从堆中分配它并使count指向此声明:

int (*count)[26][26][26][26] = calloc(sizeof(*count), 26);
if (count == NULL) {
    /* handle allocation failure gracefully */
    fprintf(stderr, "cannot allocate memory for 5D array\n");
    exit(1);
}

答案 1 :(得分:4)

使其成为全局 1 或使其静态或动态分配相同数量的内存。动态内存分配从内存的一部分分配内存,该内存的约束范围不大于您所面临的约束。具有自动存储持续时间的变量可能存储在大多数实现中的堆栈中。动态内存属于大多数实现中的

你可以这样做(插图): -

int (*a)[26][26][26][26] = malloc(sizeof *a *26);
if(!a){ perror("malloc");exit(1);}
...
free(a);

1 静态存储持续时间 - 文件范围中定义的所有变量都有静态存储持续时间。

答案 2 :(得分:2)

通过这种数组声明,您的数据将存储在堆栈中。并且堆栈在unix&likes系统上通常只有1 MB,在Windows上只有8 MB。但是你需要至少4 * 26 ^ 5 B(大约46 MB)。

首选解决方案是使用malloc上分配此数组。

但您也可以指示编译器increase the stack size ...

答案 3 :(得分:-3)

试试这个

#define max=11881376   //answer of 26*26*26*26*26
int count[max];   //array