2012-11-22 116 views
5

我有一个程序问题,我想在C中声明一个256x256数组。不幸的是,每次我尝试甚至声明一个数组的大小(整数),并且运行我的程序时,它意外终止。有什么建议么?我没有尝试过内存分配,因为我似乎无法理解它如何与多维数组一起工作(尽管我是C新手,但可以随时指导我完成)。另一个值得注意的事情是我可以用C语言声明一个248x248的数组,但没有任何问题,但不会更大。为什么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" 

我使用赛特323(不知道如何检查GCC版本)。

+0

你应该可以这样做,除非你使用的是旧编译器(?!)(我在Windows上测试过,它的堆栈大小为1MB)。 – nhahtdh

+2

你可能会通过在本地声明堆栈来炸毁你的堆栈。对于大多数机器来说,这本身并不是一个巨大的阵列。关于如何声明和使用动态分配的二维数组,有许多答案。搜索一下。 – Duck

+0

你可以发表你如何初始化数组的代码示例吗? –

回答

1

您不一定会认为“意外终止”必然直接是因为“声明256x256阵列”。

SUGGESTION:

1)煮沸代码下降到一个简单的,独立的例子

2)在调试器

3)当 “意外终止” 运行它,使用调试器来得到一个“堆栈回溯” - 你必须确认正在失败

4特定行)你也应该看看具体的错误信息(如果可能)

5)发布你的代码,错误信息和你的追踪

6)一定要告诉我们什么平台(例如, Centos Linux 5.5)以及您正在使用的编译器(例如gcc 4.2.1)。

+0

@ user1843701 - 感谢您的额外信息。试试这个:int mainmatrix [256] [256];'。正如Jonathan Leffler正确指出的那样,也许你无意中调用VLA('main majormatrix [x] [y]'),而你真正需要的是一个固定长度的数组。尝试一个常量而不是一个变量,看看它是否有帮助。恕我直言...... – paulsm4

+0

讨厌问,但我如何在调试器中运行我的代码?我正在使用SciTE,如果这对我有帮助的话。 – user1843701

+0

SciTE是一个文本编辑器。它是[Scintilla](http://www.scintilla.org/)的一部分。我承认 - 我对任何一个都不熟悉。但听起来像SciTE/Scintilla在你的系统上使用gcc。 gcc和gdb调试器配合良好。下面是gdb中的一个(很多)很好的“快速入门指南”:http://www.cs.cmu.edu/~gilpin/tutorial/ – paulsm4

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; 
} 
+0

再次 - OP应该在调试器下运行一个独立的测试(如你的例子),确定它在哪里崩溃,并回传1)完整的错误信息,2)故障点,3)编译器和平台。恕我直言...... – paulsm4

+0

是的,你的代码确实有效。谢谢你的帮助!现在我的问题可能存在于其他地方,但是可能是因为我宣布了很多这些大矩阵(比如说少于十个)?在我最初的代码中(我发现这篇文章太长了)我有很多循环,嵌套循环和256x256矩阵在各处滚动...... – user1843701

+0

这肯定是问题所在。尝试动态分配这些数组,并查看是否可以修复它。但保罗是正确的 - 最确定的解决方案是用调试器回溯错误。 –

10

有三个地方,你可以在C分配数组:上

  • 自动内存(通常被称为”堆“)
  • 动态存储器(malloc/free),或
  • 静态内存(static关键字/全局空间)。

只有自动内存对分配量有一些严格的限制(也就是说,除了操作系统设置的限制外)。动态和静态分配可能会占用操作系统提供给您的进程的尽可能多的空间。

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

相关问题