【问题标题】:Declaring a 5d array of size 26^5 in C在 C 中声明一个大小为 26^5 的 5d 数组
【发布时间】:2018-02-04 14:42:02
【问题描述】:

我的问题很简单。

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

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

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

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

有没有办法绕过这个限制?

谢谢!

【问题讨论】:

  • 在堆上分配你的数组,而不是在栈上。
  • 我认为对于这种情况(一个小型​​的独立程序),将其声明为静态或全局变量实际上是最简洁的选择 - 目前的答案没有强调这一点。
  • 大约 4700 万个条目!这将超过堆栈的可用大小(尤其是在 Windows 上)建议将该数组声明移动到“文件全局空间”。 IE。在任何函数定义之外。

标签: c arrays


【解决方案1】:

在具有 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);
}

【讨论】:

  • 另外,请确保在调用calloc 后检查count 是否为空,因为分配可能会失败,尤其是在您转到下一个维度时。
【解决方案2】:

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

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

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

1静态存储时长 - 文件范围内定义的所有变量都有静态存储时长。

【讨论】:

  • 请注意,我的回答可能听起来有点不同......因为标准没有提到堆或堆栈 - 它是语言实现的一部分......这就是为什么答案中的粗体文本......
【解决方案3】:

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

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

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

【讨论】:

    【解决方案4】:

    试试这个

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

    【讨论】:

    • 这比问题中的int count[26][26][26][26][26]好多少?
    • 当您为 5d 数组创建时,编译时可能会出错。如果您声明如此巨大的价值,那就更简单了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多