• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:c 言語初心者です。 )

c言語初心者のための構造体配列のバッファオーバーランエラーの原因と解決方法

このQ&Aのポイント
  • c言語初心者が構造体配列を作成した際にバッファオーバーランエラーが発生しています。エラーの原因や解決方法について教えてください。
  • プログラム上でのバッファオーバーランエラーの原因としてヒープ領域の問題が考えられます。具体的な解決方法についても教えてください。
  • 構造体配列のメンバを設定する際に起こるバッファオーバーランエラーの原因と解決方法について教えてください。

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

  • ベストアンサー
回答No.3

もっと簡単に考えて肩の力を抜いてプログラミングされてはいかがでしょうか。 プログラムの違いをチェックすればわかると思います。 頑張って下さい :-) (使用OS: Mac OSX、スペースは2バイトですので半角に変更のこと) #include <stdio.h> #include <string.h> #define SIZE 25   /* 文字の許容バイト数 */ #define MEMBER 3  /* 登録人数+α */ struct s {  // int n;     意味不明です。  char name[SIZE];  char huri[SIZE];  char num[SIZE]; } data[MEMBER];   /* main()の初めに置くと広域変数として使えるよ */ /* プロトタイプ宣言 */ void touroku(void); void hyouji(void); int main(void) {  touroku();  /* 広域変数としたから引数は考えなく良い */  hyouji();   /*   〃      */  return 0; } /* 構造体のメンバを設定する */ void touroku(void) {  int i, n;  for(i = 0; i < MEMBER; i++) {   fprintf(stderr, "%d文字以内の名前を入力して下さい\n", SIZE);   fgets( data[i].name, SIZE, stdin );   data[i].name[strlen(data[i].name) - 1] = '?0';   fprintf(stderr, "%d文字以内のふりがなを入力して下さい\n", SIZE);   fgets( data[i].huri, SIZE, stdin );   data[i].huri[strlen(data[i].huri) - 1] = '?0';   fprintf(stderr, "整数を入力して下さい\n");   fgets( data[i].num, SIZE, stdin );   data[i].num[strlen(data[i].num) - 1] = '?0';  } } /* 構造体のメンバを出力する */ void hyouji(void) {  int i;  for(i = 0; i < MEMBER; i++) {   printf("%-8s %3s %3s %d\n" ,data[i].name , data[i].huri , data[i].num , i);   printf("----------------------------------------------------------------?n");  } }

armpoint
質問者

お礼

ありがとうございます。 難しく考えすぎというのは自覚しているのですが、基本を理解できていないのでなかなか柔軟に考えてないみたいです。 ご丁寧にわかりやすく書いていただき大変参考になりました。

その他の回答 (3)

回答No.4

 解答がズレてしまいました m(_ _)m #1さんが正解ですよ。  単一の変数なのに for() を3つの変数枠があるかのようにプログラミングしてあるために不正なアクセスとなってバスエラーが出るということです。  後はエラーとは関係ありませんが、while(getchar()) を strlen() に換えれることでしょうか。また、変数枠は #define で先に決めて置くのがCの一般的な使い方になっています。理由は、その #define を直すだけでプログラム全体が更新できるからです。 #include <stdio.h> #include <string.h> #define SIZE 25 #define MEMBER 2 struct s { char name[SIZE]; char huri[SIZE]; char num[SIZE]; }; /* プロトタイプ宣言 */ void touroku(struct s *); void hyouji(struct s *); int main(void) { struct s data[MEMBER]; touroku(data); hyouji(data); return 0; } /* 構造体のメンバを設定する */ void touroku(struct s *p) { int i, n; for(i = 0; i < MEMBER; i++) { fprintf(stderr, "%d文字以内の名前を入力して下さい\n", SIZE); fgets( p[i].name, SIZE, stdin ); p[i].name[strlen(p[i].name) - 1] = '\0'; fprintf(stderr, "%d文字以内のふりがなを入力して下さい\n", SIZE); fgets( p[i].huri, SIZE, stdin ); p[i].huri[strlen(p[i].huri) - 1] = '\0'; fprintf(stderr, "整数を入力して下さい\n"); fgets( p[i].num, SIZE, stdin ); p[i].num[strlen(p[i].num) - 1] = '\0'; } } /* 構造体のメンバを出力する */ void hyouji(struct s *p) { int i; for(i = 0; i < MEMBER; i++) { printf("%-8s %3s %3s %d\n" ,p[i].name , p[i].huri , p[i].num , i); printf("----------------------------------------------------------------\n"); } }

armpoint
質問者

お礼

ありがとうございます。 まだまだ分からない事が多くて、書き方など大変参考になります。 今やってる構造体配列やポインタが混ざってくるといろいろ混乱してしまって、 ありがとうございました。

回答No.2

>私は下記の構造体配列をつくりました。 >struct s data; これのどこが「構造体配列」なのか、小一時間問い詰めても宜しいか?

armpoint
質問者

補足

答えていただけないなら書き込みはご遠慮ください。他の方が不快に感じる文章です。

  • towad
  • ベストアンサー率80% (4/5)
回答No.1

mainの最初で  struct s data; と、単一の変数として定義されているのに、tourokuやhyouji関数では 渡された引数を構造体sの配列として使おうとしています。 とりあえずmainの処理を struct s data[3]; touroku( data ); hyouji( data ); とすれば辻褄が合うのではないでしょうか。

armpoint
質問者

お礼

ありがとうございます。 いろいろ理解できていなかったので、書き方が構造体になってました。 なんとかやってみます。