1

行の値を 100000 に保つと、プログラムは正常に動作しますが、100 万行を 1000000 にすると、プログラムでセグメンテーション エラーが発生します。理由は何ですか?Linux 2.6x RHEL カーネルで以下を実行しています。

#include<stdio.h>

#define ROWS 1000000
#define COLS 4

int main(int args, char ** argv)
{
  int matrix[ROWS][COLS];

  for(int col=0;col<COLS;col++)
  for(int row=0;row < ROWS; row++)
    matrix[row][col] = row*col;

  return 0;
}
4

3 に答える 3

4

は、関数matrix内のローカル変数ですmain。そのため、マシン コール スタックに「割り当て」られます。

このスタックにはいくつかの制限があります。

matrixグローバルまたはstatic変数にするか、ポインターにして、メモリーゾーンを (egcallocまたはで) ヒープ割り当てする必要があります。失敗する可能性があることmallocを忘れないでください(NULLを返すことにより)。callocmalloc

そのようなことをヒープ割り当てするより良い理由は、行列の次元が実際には変数または何らかの入力である必要があるということです。ソース コードに次元を組み込む理由はほとんどありません。

ヒューリスティック: ローカル フレーム (ローカル変数のサイズの累積合計) が 1 キロバイトまたは 2 キロバイトを超えることはありません。

[もちろん、そのヒューリスティックには有効な例外があります]

于 2013-03-01T19:47:51.283 に答える
2

スタック変数を割り当てているため、各プログラムのスタックは制限されています。

あまりにも多くのスタック メモリを割り当てようとすると、カーネルは SEGV シグナル (セグメンテーション フォールト) を送信してプログラムを強制終了します。

より大きなメモリ チャンクを割り当てたい場合は、 を使用mallocします。この関数はヒープからメモリを取得します。

于 2013-03-01T19:47:56.333 に答える
1

システムでは、スタック割り当てをそれほど大きくすることを許可してはなりません。グローバルmatrixにするか、動的割り当てを ( および を介しmallocfree) 使用すれば問題ありません。

于 2013-03-01T19:47:43.523 に答える