C 动态分配2个指针时出错

C 动态分配2个指针时出错,c,malloc,free,C,Malloc,Free,在处理malloc函数时,我遇到了一些我无法理解的有点奇怪的事情 我声明了2个指针,并为它们分配了内存,如下所示: struct User { char *username, *password; }; int main() { struct User user; user.username = user.password = malloc (50); scanf ("%s %s", user.username, user.password); prin

在处理malloc函数时,我遇到了一些我无法理解的有点奇怪的事情

我声明了2个指针,并为它们分配了内存,如下所示:

struct User {
    char *username, *password;
};

int main() {
    struct User user;
    user.username = user.password = malloc (50);
    scanf ("%s %s", user.username, user.password);
    printf ("%s %s\n", user.username, user.password);

    free (user.username);
    free (user.password);

    return 0;
scanf()
printf()一样工作正常。

但是,当涉及到
free()
时,会出现一个错误。当我只释放两个指针中的一个时,错误不会发生。我知道这与代码的
user.username=user.password
部分有关,但我不明白到底发生了什么


感谢您的回答。

赋值返回已赋值的值。因此,在您的示例中,user.username和user.password将指向相同的内存位置(malloc返回的那个)。当您对它们两个调用free()时,相同的位置会被释放两次,这会导致错误

尝试分配两个不同的内存块:

user.username = malloc (50);
user.password = malloc (50);

你打了
malloc
一次,为什么你认为你需要
free
两次?
user.username=user.password=malloc(50)-一次分配,两次免费
s-一个问题。问题二-
user.username
user.passbrow
将指向同一个位置!它不是为这两个变量调用malloc吗?不,它不是。@EdHeal因为它指向同一个位置,为什么scanf的第二部分(user.password)不会删除第一部分(user.username)中写入的内容?