我的问题很简单。
我正在建立一个小程序来使用马尔可夫链分析和模拟随机文本。我的第一个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]
有没有办法解决这个限制?
谢谢!
答案 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