【问题标题】:Why is 248x248 the maximum bi dimensional array size I can declare?为什么我可以声明的最大二维数组大小是 248x248?
【发布时间】:2012-11-10 09:15:24
【问题描述】:

我有一个程序问题,我想在 C 中声明一个 256x256 数组。不幸的是,我每次尝试声明一个该大小(整数)的数组并运行我的程序时,它都会意外终止。有什么建议?我没有尝试过内存分配,因为我似乎无法理解它如何与多维数组一起工作(尽管我是 C 新手,但请随时指导我完成它)。另一个需要注意的有趣的事情是,我可以在 C 中毫无问题地声明一个 248x248 数组,但不会更大。

dims = 256;  
int majormatrix[dims][dims];

编译:

gcc -msse2 -O3 -march=pentium4 -malign-double -funroll-loops -pipe -fomit-frame-pointer -W -Wall -o "SkyFall.exe" "SkyFall.c"

我正在使用 SciTE 323(不确定如何检查 GCC 版本)。

【问题讨论】:

  • 你应该可以这样做,除非你使用的是旧的编译器(?!)(我在 Windows 上测试过,堆栈大小为 1MB)。
  • 你可能会通过在本地声明它来炸毁你的堆栈。对于大多数机器来说,这本身并不是一个庞大的阵列。 SO上有很多关于如何声明和使用动态分配的二维数组的答案。搜索一下。
  • 你能发布一个你如何初始化数组的代码示例吗?
  • 我使用的是 8GB、64 位 Windows 7 Ultimate 机器和 i7。
  • 你是如何定义dims = 256的?这是#define 或enum 或const int 还是只是int?在后两种情况下,您使用的是 VLA — 可变长度数组。这是 C99 功能,所以我假设您没有使用它(除非您也没有使用 MSVC)。请使用准确的信息更新问题(而不是添加 cmets)。数组占用256 KiB;这是一个用于放置在堆栈上的中等大小的数组;对于静态或动态分配的数组来说,它并不过分。

标签: c arrays multidimensional-array integer


【解决方案1】:

在 C 语言中有三个地方可以分配数组:

  • 在自动内存中(通常称为“上栈”)
  • 在动态内存中(malloc/free),或者
  • 在静态内存中(static关键字/全局空间)。

只有自动内存对分配量有一些严格的限制(即除了操作系统设置的限制之外);动态和静态分配可能会占用几乎与操作系统为您的进程提供的空间一样多的空间。

查看是否是这种情况的最简单方法是将声明移到函数之外。这会将您的数组移动到静态内存。如果崩溃继续,它们与数组的大小无关。

【讨论】:

    【解决方案2】:

    除非您运行的是非常旧的机器/编译器,否则没有理由应该太大。在我看来,问题出在其他地方。试试下面的代码,告诉我它是否有效:

    #include <stdio.h>
    
    int main()
    {
      int ints[256][256], i, j;
      i = j = 0;
      while (i<256) {
        while (j<256) {
        ints[i][j] = i*j;
        j++;
       }
       i++;
       j = 0;
     } 
     printf("Made it :) \n");
     return 0;
    }
    

    【讨论】:

    • 再次 - OP 应该在调试器下运行独立测试(如您的示例),确定它崩溃的确切位置,并回发 1)完整的错误消息,2)故障点,以及3)编译器和平台。恕我直言...
    • 是的,您的代码确实有效。谢谢你的帮助!现在我的问题可能出在其他地方,但是否是因为我声明了很多这样的大型矩阵(比如,少于十个)?在我的原始代码中(我认为它太长了无法发布)我有很多循环、嵌套循环和 256x256 矩阵到处滚动......
    • 这肯定是问题所在。尝试动态分配这些数组,看看是否能解决它。不过,Paul 是正确的——最可靠的解决方案是使用调试器回溯错误。
    【解决方案3】:

    您不一定认为“意外终止”一定是因为“声明了一个 256x256 数组”。

    建议:

    1) 将您的代码简化为一个简单的独立示例

    2) 在调试器中运行

    3) 当它“意外终止”时,使用调试器获取“堆栈回溯” - 您必须确定失败的特定行

    4) 您还应该查找特定的错误消息(如果可能)

    5) 发布您的代码、错误消息和您的回溯

    6) 请务必告诉我们您也在使用什么平台(例如 Centos Linux 5.5)和编译器(例如 gcc 4.2.1)。

    【讨论】:

    • @user1843701 - 感谢您提供更多信息。试试这个:int majormatrix[256][256];。正如 Jonathan Leffler 正确指出的那样,也许您无意中调用了 VLA (int majormatrix[x][y]),而您真正想要的只是一个固定长度的数组。尝试使用常量而不是变量,看看是否有帮助。恕我直言...
    • 不想问,但我如何在调试器中运行我的代码?我正在使用 SciTE,如果这有帮助的话。
    • SciTE 是一个文本编辑器。它是Scintilla 的一部分。我承认 - 我对任何一个都不熟悉。但听起来 SciTE/Scintilla 在您的系统上使用 gcc。 gcc 与 gdb 调试器配合得很好。这是 gdb 上(许多)好的“快速入门指南”之一:cs.cmu.edu/~gilpin/tutorial
    • 根据您下面的 cmets,听起来在您的数组声明中将变量“dims”更改为常量“256”解决了这个问题。酷:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-22
    • 2012-03-12
    • 1970-01-01
    • 2013-08-24
    • 2021-10-07
    • 2017-07-23
    • 1970-01-01
    相关资源
    最近更新 更多