• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:データ数を増やすとエラーになる)

データ数を増やすとエラーになる理由とは?

このQ&Aのポイント
  • プログラムでデータ数を増やすとエラーが発生する理由を教えてください。
  • データ数を増やすとプログラムが正常に動作しない理由について知りたいです。
  • データ数を増やすとプログラムがエラーになる原因について教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • mac_res
  • ベストアンサー率36% (568/1571)
回答No.4

バグが原因でstackを破壊しているときは、バグとは一見無関係のところでエラーが発生します。デバッガーで1ステップずつ追うか、もうちょっと広い範囲のソースを載せてみてください。

inayou
質問者

お礼

ご指摘の通り、広い範囲で見直したら、間違っていたところが見つかりました。mallocでデータ数ぶんだけとるつもりが1つだけしか領域をとってませんでした。 回答ありがとうございました。

その他の回答 (3)

回答No.3

#1です。 さらにループ回数を増やした所、 11,080,000~11,090,000回程度繰り返した所でメモリが足りなくなりました。 とりあえず、ソース乗せときます。 #include <stdio.h> #include <stdlib.h> typedef struct DATA{ int data; struct DATA *left; struct DATA *right; }node,*tree; tree makenode(int data) { tree q; if((q=(tree)malloc(sizeof(node)))==NULL){ printf("メモリ割り当てエラー(%d)\n",data); system("pause>NUL"); exit(-1); } q->left=NULL; q->right=NULL; q->data=data; return q; } int main() { int i,j; tree dmm[10000]; for( j=0;j<10000;j++) { printf("start[%d]\n",j); for( i=0;i<10000;i++) { // printf("start[%d]\n",i); dmm[i] = makenode(i); } } printf("正常\n"); system("pause>NUL"); return 0; } system("pause>NUL")は、そこでキー入力があるまで一旦停止させるためのものです。 エラーの原因としては、 1)繰り返すfor()の方に問題があるかもしれない。 2)実行環境のせいかもしれない。 程度までしかわかりません。 デバッグ用のログの入れ方ですが、もし現状で if((q=(tree)malloc(sizeof(node)))==NULL){ // ログ1 … } // ログ2 と入れている場合には、 // ログ1 q=(tree)malloc(sizeof(node)); // ログ2 if(q==NULL){ // ログ3 … } // ログ4 と入れてみてください。もしかしたら何かわかるかもしれません。

inayou
質問者

お礼

違うところでのバグのせいでした。 回答ありがとうございました

inayou
質問者

補足

回答ありがとうございます。 やはりループ回数を5以上にすると、 1回目のループのログ2が出ません。 4以下ではちゃんと出るのになぜ? っていう感じです。

  • mac_res
  • ベストアンサー率36% (568/1571)
回答No.2

下記の通り100000回まわしてもエラーになりませんでした。エラーはほかの部分にあるのではないでしょうか? またどのようなエラーが返っているのか明記してください。 #include <stdio.h> #include <stdlib.h> typedef struct DATA { int data; struct DATA *left; struct DATA *right; } node , *tree; tree makenode(int data) { tree q; if ((q = (tree) malloc(sizeof(node))) == NULL) { printf("メモリ割り当てエラー\n"); exit(-1); } q->left = NULL; q->right = NULL; q->data = data; return q; } int main(void) { int i; for (i = 0; i < 100000; i++) { makenode(i); printf("%d\n",i); } return 0; }

inayou
質問者

お礼

違うところでのバグのせいでした。 回答ありがとうございました

inayou
質問者

補足

回答ありがとうございます そのプログラムでは、ちゃんと動くのに、作ろうとしているものでは やはりエラーが出てしまいます。

回答No.1

「エラーになる」とは、どういう状況ですか? エラー吐いて強制終了?malloc()が失敗するだけ? コピペして、for()で回す用にmain()を補充し、手元で動かしてみましたが、 for()で100回繰り返してもエラーは発生しませんでした。 何処か他に問題はありませんか?

inayou
質問者

補足

エラーは 「問題が発生したため<プログラム名>を終了します」 とでて、エラーを送信しますかというものがでます。 プログラムの間にprintfを使ってどこまで実行されているかを調べたら makenode関数内のmallocでした(mallocの後のprintfが表示されないで終了)。なぜでしょうか?

関連するQ&A

専門家に質問してみよう