2017-12-02 2 views
0

私は動的に割り当てられた構造体に人の姓と名前を格納して、それをターミナルでプリントするプログラムを作ろうとしています。今のところ、私は "セグメンテーションフォールト"エラーは、端末の最後の名前を入力した後です。私はそれをどのように機能させるのですか?前もって感謝します!C - mallocと構造体、セグメンテーションフォールバック

マイコード:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

struct person{ 
     char *last_name; 
     char *name; 
    }; 

struct person *p_person; 

int main(void) 
{ 
    p_person=malloc(sizeof(struct person)); 
    scanf("%s", p_person->last_name); 
    scanf("%s", p_person->name); 


    puts(p_person->last_name); 


    free(p_person); 
    return 0; 
} 

答えて

1

p_person->last_nameはどこに指していません。あなたは許可されていないメモリにアクセスしていました。あなたはそれにアクセスする未定義のビヘイビアを呼び出します。解決策は、いくつかのメモリを動的に割り当てるか、char last_name[MAXLEN];を構造体に使用することです。

解決方法1:

struct person{ 
     char last_name[50]; 
     char name[50]; 
    }; 

解決策2:ソリューション-2では

p_person->last_name = malloc(50); 
if(p_person->last_name == NULL){ 
    fprintf(stderr,"error in malloc"); 
    exit(1); 
} 

、 はまたnameのために同じことを行う必要があります。 作業が終了したら、動的に割り当てられたメモリを解放します。バッファサイズより小さい


scanf("%49s", p_person->last_name)一つ。 scanf()が文字列の解析を終えると、自動的にNUL終了文字が付加されます。