アプリ版:「スタンプのみでお礼する」機能のリリースについて

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;
}
上記のプログラムソースでセグメンテーション違反と出てしまいます。
原因はなんなのでしょうか。
教えていただければ光栄です。

A 回答 (4件)

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;
}
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/07/06 14:25

ANo.2です。


回答した後に気がつきました。

typedef struct{
int id;
char *name;
}user;

nameはポインタで実体がありません。ここは、
char name[MAX_NAME_LEN];
などに変えるか、mallocで領域を確保してそのポインタを設定するように変えたほうが良いでしょう。
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/07/06 14:31

#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で確保した領域以外を指さないようにガードするとなお良いです。
    • good
    • 0

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;
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/07/06 14:22

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!