2016-03-19 12 views
-2

dönen bu başlık dosyası var: C - Hata bir yapı

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

Şimdi ana programda bunu: adı doğru gösterdi printf() createrUser yılında

#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; 
} 

, ancak ikinci baskıda (üst baskı) sadece "@" gösterir. Teoride bir kullanıcı değişkeni yaratıyorum ve onu aynı tip bir değişkene atayım, ancak süreçte bir değişiklik gibi görünüyor.

Herhangi bir fikrin var mı?

+0

Ama yapı içine verileri taklit ediyorum. In_login veya in_name ile ne olduğu önemli değil. Yok hayır? – Argos

+3

1) İşaretçi yazmıyor. 2) otomatik değişkenler, blokları bırakıldığında yayından kaldırılır. 3) Neden dizinin 'struct' içinde kendisi yok? 4) Eğer bir işaretçi bir dizi ise, "dizi" olarak adlandırılır, "işaretçi" 5 değil. İşaretçiler, diziler ve diğerleri hakkında bir C kitap okuyun. – Olaf

+0

Damn, @ user3121023 haklısınız. Çok sağolun. Java TT – Argos

cevap

1

CreateUser işlevinde, yerel dizilere usAux yerel yapısına işaretçiler depolarsınız. Bu yapıyı değere göre döndürdüğünüzde, bu işaretçiler hedef yapıya kopyalanır. Hala döndüğünden beri çağrılan işlevdeki otomatik dizilere işaret ediyorlar. Bunları tanımlamak, tanımlanmamış davranışları çağırır. Muhtemelen bu dizeyi ayırmalısınız.

Yazımın arkasındaki işaretçilerin gizlenmesi, işaretçilerin gizlenmesi, sorunların ortadan kalkmasına neden olmadığının ve bunların gerçekleşmesini daha olası hale getirmenin önemli bir fikir olduğunu unutmayın. İşte

size kod versiyonunu değiştirilir:

#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; 
}