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

在C中声明大小为26^5的5d数组,c,arrays,C,Arrays,我的问题很简单 我正在建立一个小程序,用马尔可夫链分析和模拟随机文本。我的第一个MC内存大小为2,处理字母表{a,b,…,z}。因此,我的转移矩阵的大小是26*26*26 但是现在,我想使用内存为4的MC来增强我的模拟。因此,我需要将我的跃迁概率存储在一个大小为26*26*26*26*26的5D数组中 问题是(我相信),C不允许我声明和操作这样一个数组,因为它可能太大了。事实上,我在写作时得到了一个提示: 整数计数[26][26][26][26] 有没有办法绕过这一限制 谢谢 使其成为全局1或使

我的问题很简单

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

但是现在,我想使用内存为4的MC来增强我的模拟。因此,我需要将我的跃迁概率存储在一个大小为26*26*26*26*26的5D数组中

问题是(我相信),C不允许我声明和操作这样一个数组,因为它可能太大了。事实上,我在写作时得到了一个提示:

整数计数[26][26][26][26]

有没有办法绕过这一限制

谢谢

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

您可以这样做(如图所示):-



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

在具有32位整数的典型PC体系结构上,
int count[26][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);
}

使用这种数组声明,您的数据将存储在堆栈中。在类Unix系统上,堆栈通常只有8MB,在Windows上只有1MB。但您至少需要4*26^5B(大约46MB)

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

但您也可以指示编译器…

试试这个

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

在堆上而不是堆栈上分配数组。我认为在这种情况下(一个小型独立程序),将其声明为静态或全局变量实际上是最干净的选择-下面的当前答案强调了这一点。即约4700万个条目!这将超过堆栈的可用大小(特别是在windows上)建议将数组声明移动到“文件全局空间”。也就是说,在任何函数定义之外。请注意,我的答案可能听起来有点不同……因为标准中没有提到堆或堆栈——它是语言实现的一部分……这就是为什么答案中的粗体文本……这比
int count[26][26][26][26]更好吗问题中的
?当您为5d数组创建时,编译时可能会出错。如果您声明了如此大的值,请确保在调用
calloc
后检查
count
是否为null,因为分配可能会失败,特别是如果您转到下一个维度。
#define max=11881376   //answer of 26*26*26*26*26
int count[max];   //array