0

の値を出力しようとすると、次のプログラムがクラッシュしますv。その理由を理解しようとしています。助言がありますか?

#include <stdio.h>

int main() {

    int v[5000000];
    printf("\n\nv = %p", v);
     return 0;
}

EDIT : 5000000 個の要素を割り当てる代わりに、500000 以下を割り当てると、プログラムは segfault しません。

EDIT(2) : スタックサイズを増やすと問題が解決しました。Linux では、stephane-rouberol の回答を読んだ後 (を使用してulimit -s <some_large_number>)、スタック サイズを増やします。

4

6 に答える 6

1

スタックオーバーフロー !ulimit -s使用するかどうか、または使用するbashlimit stacksizeどうかを確認します[t]csh

または、スタックを使用する代わりに、ヒープを使用できますmalloc

于 2012-08-27T08:18:04.820 に答える
1

おめでとう、スタックオーバーフローがあります:)

スタックのサイズを増やすか、配列を動的に割り当てる方法を見つけてください。

int* v = malloc( 5000000 * sizeof *v);

/* do something */

free( v );
于 2012-08-27T08:13:46.980 に答える
0

あなたにはすでに原因があります。が割り当てられる5000000プログラム スタックを処理するには大きすぎます。vで動的に割り当てる必要がありますmalloc

于 2012-08-27T08:15:16.960 に答える
0

プログラムのスタック サイズはコンパイラ スイッチに依存し、デフォルトは OS ごとに異なります。あなたの場合、スタックが小さすぎてその大きな数に対応できないように聞こえます。スタック サイズを増やすには、コンパイラ (リンカー) スイッチを参照してください。

于 2012-08-27T08:17:27.803 に答える
0

試す

printf("\n\nv = %p", (void *)v);
于 2012-08-27T08:17:38.940 に答える
0

他の人が言ったように、スタックオーバーフロー。コードが実際にクラッシュする理由と時期を理解するために、行間で次のように説明します。

  • スタックに 5000000 * sizeof(int) を割り当ててみてください。これが20MBであると仮定しましょう。
  • コンパイラーは (リンカーとは対照的に) スタックの大きさを認識していない可能性が高いため、20MB のスタックが使用されていると想定しています。
  • printf() を呼び出すと、ポインタ アドレスがスタック上で関数に渡されます。コンパイラは、このポインタ アドレス (4 バイト) をスタック位置 0 + 20000004 にプッシュしようとします。これは有効なメモリの外側にあり、ここでプログラムがクラッシュします。
  • コンパイラが printf() に別の呼び出し規則を使用していた場合、たとえば代わり​​にポインター アドレスを CPU レジスターに渡すことによって、その巨大な配列から実際に読み取り/書き込みを試みるまで、プログラムはクラッシュしませんでした。
于 2012-08-27T08:43:45.330 に答える