C - 返回结构时出错

时间:2016-03-19 16:16:32

标签: c string struct

我有这个头文件:

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

现在在主程序中我这样做:

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

在createrUser()printf中,名称显示正确,但在第二次打印(顶部printf)中,它只显示“@”。从理论上讲,我正在创建一个用户变量,并将其分配给同一类型的变量,但看起来过程中发生了一些变化。

有什么想法吗?

1 个答案:

答案 0 :(得分: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;
}