1

これが私のコードです

#include<stdio.h>
#define ROW 10000
#define COLUMN 10000
void hello(int arr[ROW][COLUMN]){
    printf("hoho");
}
void main(){
    int arr[ROW][COLUMN];
    hello(arr);
}

さて、これによりセグメンテーション違反が発生します。私の質問は、関数呼び出しを行っている間、関数に渡されたすべての変数を保持するためにスタックが使用されていることを理解しているということです。これはOSのスタックですか?つまり、OS には、このために特別に設計された別のメモリ ブロックがありますか?

また、スタックのサイズは固定ですか?

このような大きな値を関数に渡さなければならない場合はどうすればよいでしょうか?

4

4 に答える 4

2

"場合によります"。C は、ローカル変数または呼び出しのいずれかに使用される「スタック」と呼ばれるものがあることさえ指定しません。

実際には、はい、使用されているのはプロセスの「実際の」オペレーティングシステムによって作成されたスタックです。これは、一般にハードウェアサポートがあるためです (ほとんどのプロセッサには、スタックを非常に効率的に実装するための指示があります)。

通常、大きな配列は「ヒープ上」に割り当てるのが最適malloc()です。

于 2013-04-30T09:10:53.697 に答える
2

OS には、そのすべてのタスクに対して個別のスタックがあります。OS のメモリを簡単に破壊できたら大変なことになります。
コンパイラにもよりますが、通常は約 1 MiB のスタック メモリがあります。このような大量のメモリを使用する必要がある場合は、mallocまたはを使用callocしてヒープからメモリを割り当てます。

編集

Windows のメモリ レイアウトは次のようになりますこれに関する記事はこちらです

于 2013-04-30T09:12:21.343 に答える
1

if you are in linux

ulimit -a 

this is the command to see stack size along with other options

 ulimit -s unlimited

will set the stack size to unlimited size

in my machine it was

stack size (kbytes, -s) 8192

where it produced a seg fault and on altering the stack size to unlmited it did work fine

may be

man -a ulimit

is the option to resolve this in program logic

P.S - this is specific to linux environment

于 2013-05-12T17:30:19.830 に答える
0

絶対にありません。アプリケーションはユーザー モードで動作し、独自のメモリ空間を持っています。最新の OS では、各アプリケーションは独自のメモリ空間で動作し、別のメモリに書き込み/読み取りを行うことはありません (共有メモリを使用しない限り)。値を入れすぎると、スタック オーバー フローが発生します。

于 2013-04-30T09:20:38.207 に答える