我有这个头文件:
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)中,它只显示“@”。从理论上讲,我正在创建一个用户变量,并将其分配给同一类型的变量,但看起来过程中发生了一些变化。
有什么想法吗?
答案 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;
}