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;
}
上記のプログラムソースでセグメンテーション違反と出てしまいます。
原因はなんなのでしょうか。
教えていただければ光栄です。
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;
}
回答ありがとうございます。
試しにNO.3さんのプログラムで実行したらきちんと動作しました。
なので、そのプログラムを参考にして自分なりに考えたいと思います。
No.4
- 回答日時:
ANo.2です。
回答した後に気がつきました。
typedef struct{
int id;
char *name;
}user;
nameはポインタで実体がありません。ここは、
char name[MAX_NAME_LEN];
などに変えるか、mallocで領域を確保してそのポインタを設定するように変えたほうが良いでしょう。
2度も回答ありがとうございます。
ポインタとか構造体が混ざるとほんとダメで。。
がんばってmallocでポインタの領域を確保してみます。
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;
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# c言語でユーザ関数を利用して複素数のべき乗と絶対値の数列を計算するプログラムが作りたいです。 3 2023/01/29 22:13
- C言語・C++・C# C言語でif文が予想と違う動きをする件について7 4 2023/03/20 00:26
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Application.ScreenUpdating = ...
-
パイソンのクラスについて
-
パイソンのクラスのブログラム
-
パイソンプログラミング
-
【メモリ不足で落ちる(python)】
-
vscode 文字化け
-
[python] 文字列を変数名として...
-
実行時エラー 3020の対策
-
c++の構造体について
-
この英語はどういう意味ですか?
-
[C#] string name = new ..
-
学校でプログラミングの授業あ...
-
構造体の各データの表示につい...
-
ASPへの値渡し
-
CLispのloop内の挙動について
-
Pythonでターミナルに文字を出...
-
どちのほうがすきですか?
-
パイソンのクラスについて
-
パソコン → パャRン
-
メモリをアドレスを直接指定し...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Application.ScreenUpdating = ...
-
実行時エラー 3020の対策
-
[python] 文字列を変数名として...
-
ACCESS テキストボックスを隙...
-
FindFirst を複数条件で検索
-
【メモリ不足で落ちる(python)】
-
VBA他のブックから値のみ貼付す...
-
構造体の各データの表示につい...
-
パイソンプログラミング
-
VBAでPDFのコピーとリネームを...
-
phpでボタンを押したときに変数...
-
vscode 文字化け
-
vbaでxmlからNodeListでデータ...
-
コンボボックスのtag情報の取得...
-
パイソンのクラスのブログラム
-
「*:*」って何を意味するのでし...
-
構造体の変数の値を、動的に取...
-
パイソンのクラスについて
-
C言語について
-
VBAで特殊文字を出力したい
おすすめ情報