2012-11-22 55 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關鍵字/全局空間)。

只有自動內存對分配量有一些嚴格的限制(也就是說,除了操作系統設置的限制外)。動態和靜態分配可能會佔用操作系統提供給您的進程的儘可能多的空間。

查看是否屬實的最簡單方法是將聲明移到函數之外。這會將您的陣列移動到靜態內存。如果崩潰繼續下去,它們與陣列的大小無關。

相關問題