为什么我能声明的最大二维数组大小是248x248?

5
我有一个程序问题需要在C语言中声明一个256x256的数组。不幸的是,每次我尝试甚至声明这样大小的数组(整数),并运行我的程序时,它都会意外终止。有什么建议吗?由于我无法理解如何处理多维数组,因此我还没有尝试过内存分配(不过您可以指导我)。另一个有趣的事情是,我可以在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版本)。

(注:该句已被翻译,无需再次翻译)

你应该能够这样做,除非你使用的是旧编译器(?!)(我在具有1MB堆栈大小的Windows上进行了测试)。 - nhahtdh
2
通过在本地声明堆栈,您可能会使其爆炸。 对于大多数机器而言,这本身不是一个巨大的数组。 关于如何声明和使用动态分配的二维数组,SO上有很多答案。 多搜索一下。 - Duck
你能否提供一段代码示例,展示如何初始化该数组? - Pete Baughman
1
你是如何定义 dims = 256 的?是通过 #defineenumconst int 还是仅仅使用了 int?如果是后两种情况,那么你正在使用 VLA —— 可变长度数组。这是 C99 的一个特性,因此我假设你没有使用它(除非你也没有使用 MSVC)。请更新问题并提供准确的信息(而不是添加注释)。该数组占用 256 KiB;对于放置在堆栈上的中等大小数组来说,它并不算过大;对于静态或动态分配的数组来说,它也不算过大。 - Jonathan Leffler
什么是错误信息? - Ciro Santilli OurBigBook.com
显示剩余3条评论
3个回答

10

在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;
}

再次强调 - 原帖作者应该在调试器下运行一个独立的测试(就像您的示例一样),确定它在哪里崩溃,并回复以下信息:1)完整的错误消息,2)失败点,3)编译器和平台。 依我之见... - paulsm4
是的,你的代码确实有效。谢谢你的帮助!现在我的问题可能出在其他地方,但是是否可能是因为我声明了很多这些大矩阵(比如不到十个)?在我的原始代码中(我认为太长了无法发布),我有很多循环、嵌套循环和 256x256 的矩阵到处滚动... - user1843701
这很可能是问题所在。试着动态分配那些数组看看能否解决它。虽然保罗是正确的——最可靠的解决方案是使用调试器回溯错误。 - Ricky Stewart

1

你不能简单地假设“意外终止”是因为“声明一个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]),而您*真正想要的是一个固定长度的数组。请尝试使用常量代替变量,并查看是否有所帮助。在我看来... - paulsm4
很不好意思,但我该如何在调试器中运行我的代码?我正在使用SciTE,如果这有帮助的话。 - user1843701
SciTE是一款文本编辑器,它是Scintilla的一部分。我承认 - 我对它们都不熟悉。但听起来像是SciTE/Scintilla在您的系统上使用gcc。而gcc与gdb调试器配合良好。这里有一个(众多)关于gdb的好的“快速入门指南”:http://www.cs.cmu.edu/~gilpin/tutorial/ - paulsm4
根据您下面的评论,听起来将变量"dims"更改为常量"256"在数组声明中解决了问题。太棒了 :) - paulsm4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接