1

C の関数に大きな配列を渡すのに問題があります。

私は宣言する:

int image[height][width][3]={};

ここで、高さと幅は 1500 にもなります。そして、私が呼び出すと:

foo((void *)image,height,width);

これは次のように宣言されています。

int *foo(const int *inputImage, int h, int w);

セグメンテーション違反エラーが発生します。奇妙なのは、私の値が次の場合です。

height=1200;
width=290;

問題はありませんが、次の場合:

height=1200;
width=291;

上記のエラーが発生します。高さと幅の両方が 1500 の整数あたり 4 バイト (絶対的な最悪の場合) では、配列のサイズは 27MB になります。配列。何かアドバイス?

4

2 に答える 2

3

27 MB の場合、アレイはスタック (通常は 1 MB) よりも大きい可能性があります。データの操作を開始するとすぐに、プロセスが破損fooしています。代わりにヒープに配列を割り当てます。

typedef int (*image_buf)[height][width][3];
image_buf image = malloc(sizeof(image_buf));
...
于 2010-05-27T22:44:51.103 に答える
0

UNIX システムでは、「ulimit -a」を使用してデフォルトのプロセス スタック サイズを確認できます。

   (blocks, -c) 0

データ セグメント サイズ (キロバイト、-d) 無制限のスケジューリング優先度 (-e) 20 ファイル サイズ (ブロック、-f) 無制限の保留中の信号 (-i) 16382 最大ロック メモリ (キロバイト、-l) 64 最大メモリ サイズ (キロバイト、- m) 無制限のオープン ファイル (-n) 1024 パイプ サイズ (512 バイト、-p) 8 POSIX メッセージ キュー (バイト、-q) 819200 リアルタイム優先度 (-r) 0 スタック サイズ (キロバイト、-s) 8192 CPU 時間(秒、-t) 無制限の最大ユーザー プロセス (-u) 無制限の仮想メモリ (キロバイト、-v) 無制限のファイル ロック (-x) 無制限

于 2010-06-12T04:41:05.850 に答える