• ベストアンサー

セグメンテーション違反

OSはリナックスでC言語です。 #include<stdio.h> #include<stdlib.h> typedef struct{ int id; char *name; }user; int main(void) { user *users; int i,j; users=(user *)malloc(sizeof(user)*100); for(j=0;j<5;j++) scanf("%d",&(users+j)->id); scanf("%s",(users+j)->name); free(users); printf("input your id;"); scanf("%d",&i); printf("NO%d %s\n",(users+i)->id,(users+i)->name); return 0; } 上記のプログラムソースでセグメンテーション違反と出てしまいます。 原因はなんなのでしょうか。 教えていただければ光栄です。

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

  • ベストアンサー
  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.3

ANo.1の「表示する前に開放しちゃってる」のもバグですが、他に >for(j=0;j<5;j++) >scanf("%d",&(users+j)->id); >scanf("%s",(users+j)->name); も変です。このforは「どの文までがforループなのか」を良く考えてみましょう。 それと >scanf("%s",(users+j)->name); の時に、入力した文字列を格納する「実メモリ」が存在しません。 それにnameの値は「未定義」で、どこを指しているか不明です。 #include<stdio.h> #include<stdlib.h> typedef struct{ int id; char *name; }user; int main(void) { user *users; int i,j; users=(user *)malloc(sizeof(user)*100); for(j=0;j<100;j++) { users[j].name=malloc(260); } for(j=0;j<5;j++) { scanf("%d",&(users[j].id)); scanf("%s",users[j].name); } printf("input your id;"); scanf("%d",&i); printf("NO%d %s\n",users[i].id,users[i].name); for(j=0;j<100;j++) { free(users[j].name); } free(users); return 0; }

wa------i
質問者

お礼

回答ありがとうございます。 試しにNO.3さんのプログラムで実行したらきちんと動作しました。 なので、そのプログラムを参考にして自分なりに考えたいと思います。

すると、全ての回答が全文表示されます。

その他の回答 (3)

  • DT200
  • ベストアンサー率38% (63/164)
回答No.4

ANo.2です。 回答した後に気がつきました。 typedef struct{ int id; char *name; }user; nameはポインタで実体がありません。ここは、 char name[MAX_NAME_LEN]; などに変えるか、mallocで領域を確保してそのポインタを設定するように変えたほうが良いでしょう。

wa------i
質問者

お礼

2度も回答ありがとうございます。 ポインタとか構造体が混ざるとほんとダメで。。 がんばってmallocでポインタの領域を確保してみます。

すると、全ての回答が全文表示されます。
  • DT200
  • ベストアンサー率38% (63/164)
回答No.2

#include<stdio.h> int main(void) { user *users; int i,j; users=(user *)malloc(sizeof(user)*100); for(j=0;j<5;j++){          ^ scanf("%d",&(users+j)->id); scanf("%s",&(users+j)->name);         ^ } ^ printf("input your id;"); scanf("%d",&i); printf("NO%d %s\n",(users+i)->id,&(users+i)->name);                     ^ free( users ); ^^^^^^^^^^ return 0; } おかしいところを"^"で示します(ずれているかも)。オリジナルのソースと比較して原因はご自分で考えてください。 さらに言うなら、iがmallocで確保した領域以外を指さないようにガードするとなお良いです。

すると、全ての回答が全文表示されます。
回答No.1

user *users; int i,j; users=(user *)malloc(sizeof(user)*100); for(j=0;j<5;j++) scanf("%d",&(users+j)->id); scanf("%s",(users+j)->name); free(users);<<<<<<usersを開放している printf("input your id;"); scanf("%d",&i); printf("NO%d %s\n",(users+i)->id,(users+i)->name);<<<<参照している 開放したメモリを参照しているからです return 0;

wa------i
質問者

お礼

回答ありがとうございます。 しかし、freeを一番下に持ってきてもセグメンテーション違反でした。

すると、全ての回答が全文表示されます。

関連するQ&A