2016-03-19 28 views
-2

を返す私は、このヘッダファイルがあります。 C - エラー構造体

typedef char *cadena; 
typedef struct user_t user; 
struct user_t { 
    cadena login; 
    cadena name; 
}; 
typedef struct user_t user_t; 

今すぐメインプログラムでは、私はこれを実行します。名前を正しく示したさのprintf()createrUserで

#include "HeaderFile.h" 

user createUser(); 

main() { 
    user usuario; 
    usuario = createUser(); 
    printf("%s\n", usuario.name); //This DOES NOT work 
    exit(0); 
} 

user createUser() { 
    user usAux; 
    char in_login[50], in_name[50]; 
    printf("\nWrite the user"); 
    scanf("%s", &in_login); 
    usAux.login = in_login; 
    printf("\nWrite the name"); 
    scanf("%s", &in_name); 
    usAux.name = in_name; 
    printf("%s\n", usAux.name); //This WORK 
    return usAux; 
} 

を、 2番目のプリント(トッププリント)では "@"のみ表示されます。理論的に私はユーザー変数を作成し、それを同じ型の変数に代入していますが、プロセス内で何か変わるようです。

アイデア?

+0

をしかし、私は構造体にデータをコピーしています。 in_loginまたはin_nameで何が起きても問題ありません。いいえ? – Argos

+3

1)ポインタを 'typedef'しないでください。 2)自動変数は、そのブロックが残っているとライブアウトになります。 3)なぜ 'struct'自体に配列を持たないのでしょうか? 4)ポインタが配列の場合は、 "ポインタ"ではなく "配列"と呼ばれるでしょう。ポインタ、配列、およびその他についてのCの本を読む – Olaf

+0

ダン、@ user3121023あなたは正しくありました。 Java TTの多くの年 – Argos

答えて

1

関数CreateUserでは、ローカル配列へのポインタをローカル構造usAuxに格納します。この構造体を値で返すと、これらのポインタは単に宛先構造体にコピーされます。まだ呼び出された関数の自動配列を指しています。それらを参照解除すると、未定義の動作が呼び出されます。おそらく、これらの文字列を割り当てる必要があります。

typedefの背後にポインタを隠すのは基本的な考え方ですが、ポインタで問題が解決されるわけではないので、実際にポインタが出現する可能性は高くなります。ここで

はあなたのコードのバージョンに変更されます。

#include "HeaderFile.h" 

user createUser(void); 

int main(void) { 
    user usuario; 
    usuario = createUser(); 
    printf("%s\n", usuario.name); 
    free(usuario.name); 
    free(usuario.login); 
    return 0; 
} 

user createUser(void) { 
    user usAux; 
    char in_login[50] = "", in_name[50] = ""; 

    printf("\nWrite the user: "); 
    scanf("%49s", &in_login); 
    usAux.login = strdup(in_login); 

    printf("\nWrite the name: "); 
    scanf("%49s", &in_name); 
    usAux.name = strdup(in_name); 

    return usAux; 
}