5

C で 256x256 配列を宣言したいプログラムの問題があります。残念ながら、そのサイズ (整数) の配列を宣言しようとしてプログラムを実行すると、予期せず終了します。助言がありますか?多次元配列でどのように機能するかを理解できないように見えるため、メモリ割り当てを試していません(Cは初めてですが、お気軽にガイドしてください)。もう 1 つの興味深い点は、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 のバージョンを確認する方法がわかりません)。

4

3 に答える 3

10

C で配列を割り当てることができる場所は 3 つあります。

  • 自動メモリ内 (一般に「スタック上」と呼ばれます)
  • 動的メモリ ( malloc/ ) 、freeまたは
  • 静的メモリ (キーワードstatic/ グローバル空間)。

自動メモリだけが、割り当ての量にいくらか厳しい制約があります (つまり、オペレーティング システムによって設定された制限に加えて)。動的割り当てと静的割り当ては、オペレーティング システムによってプロセスに提供されるのとほぼ同じ容量を獲得する可能性があります。

これが当てはまるかどうかを確認する最も簡単な方法は、宣言を関数の外に移動することです。これにより、配列が静的メモリに移動されます。クラッシュが続く場合、アレイのサイズとは関係ありません。

于 2012-11-22T02:02:00.587 に答える
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;
}
于 2012-11-22T02:01:37.390 に答える
1

「256x256配列の宣言」が原因で、「予期せず終了する」ことが必ずしも直接的であると必ずしも想定することはできません。

提案:

1) コードを単純なスタンドアロンの例に要約する

2) デバッガーで実行する

3) 「予期せず終了」した場合は、デバッガーを使用して「スタック トレースバック」を取得します。失敗している特定の行を特定する必要があります。

4) 特定のエラー メッセージも探す必要があります (可能な場合)。

5) コード、エラー メッセージ、トレースバックを投稿します。

6) 使用しているプラ​​ットフォーム (例: Centos Linux 5.5) とコンパイラ (例: gcc 4.2.1) も必ずお知らせください。

于 2012-11-22T01:58:40.613 に答える