をクラッシュテストプログラム私はちょうど約K & Rを読み終えています、そしてそれは私が知っているすべてのCです。すべての私のコンパイルは、MinGWを使ってWindowsのコマンドラインから実行され、私は高度なデバッギング方法について知りません(したがって、私の第2プログラムの "ゲットーデバッグ"のコメント)。理解メモリの割り当て、
私は私がより良い方法をメモリ割り当ての動作を理解するためのいくつかの小さなテストプログラムを作成しようとしています。これらの最初のカップルプログラムはmallocまたはfreeを使用していないので、関数へのローカルな標準配列のメモリの割り当てと割り当て解除を見たいと思っています。私が実行しているプロセスのRAM使用量を見て、それが私が理解しているものと一致するかどうかを確認することです。以下のこの最初のプログラムでは、期待どおりに動作します。 alloc_one_meg()
関数は、250,000の4バイト整数を割り当てて初期化しますが、関数が戻るとすぐにMBが割り当て解除されます。したがって、その関数を1000000回連続して呼び出すと、RAM使用量が1MBを大きく上回ることはありません。そして、それは動作します。以下、この2番目のプログラムのために
#include <stdio.h>
#include <stdlib.h>
void alloc_one_meg() {
int megabyte[250000];
int i;
for (i=0; i<250000; i++) {
megabyte[i] = rand();
}
}
main()
{
int i;
for (i=0; i<1000000; i++) {
alloc_one_meg();
}
}
、アイデアは、関数が、私は再帰で実現一度に実行されている同じ機能の1000のコピーを、持っているために、終了することができませんでした。私の理論では、再帰が終了した後にプログラムをすべて割り当て解除する前に、プログラムが1GBのRAMを消費するというものでした。しかし、再帰によって2番目のループを通過することはありません(私のゲットーデバッグのコメントを参照してください)。プログラムはかなり有益ではない(私にとっては)メッセージ(Windowsのポップアップで____、exeが問題に遭遇しました)でクラッシュします。通常、私はゲットーデバッグメソッドを使って、常に物事の底を知ることができます...しかし、ここでは機能しません。私は困惑している。このコードの問題は何ですか?ありがとう!
#include <stdio.h>
#include <stdlib.h>
int j=0;
void alloc_one_meg() {
int megabyte[250000];
int i;
for (i=0; i<250000; i++) {
megabyte[i] = rand();
}
j++;
printf("Loop %d\n", j); // ghetto debug
if (j<1000) {
alloc_one_meg();
}
}
main()
{
alloc_one_meg();
}
フォローアップの質問here。
これでスタックオーバーフロークラッシュが発生したため、メモリの理解を深めることができました。面白いようなことがそのように動作する方法。 –
私はプログラミングが初めてですが、テストのアイデアには新しいことはありません。私はエンジニアであり、重いソフトウェアユーザであり、壊れていることがそれらを理解する最善の方法であることをよく知っています! :-) – The111