【问题标题】:Linked list. Another value is changed in added node when changing poiner链表。更改指针时在添加的节点中更改了另一个值
【发布时间】:2016-05-31 04:19:40
【问题描述】:

我有 userStack 类型的链接列表 user

struct user {
    int id;                     // ID
    char login[20];             // login
    char password[32];          // password md5
    user *next;
};

这是添加节点的功能:

void addUser(user **userStack) {
    if (*userStack == NULL)
    {
        user *p = new user;
        *p = enterUser();
        p->next = NULL;
       *userStack = p;
    }
    else
    {
        user *p = new user;
        *p = enterUser(); / returns struct user (keyboard input)
        p->next = *userStack;
        *userStack = p;
    }
    printf("User is added successfully!\n");
}

user enterUser() {
     user *u = new user;
     int tmpID = -1;
     char tmpLogin[20];
     char tmpPass[20];
     char tmpPass2[20];
     std::string hashPass;
     system("cls");
     fflush(stdin);
     printf("Введите id пользователя: ");
     scanf("%d", &tmpID);
     while (isUserExists(tmpID) || tmpID < 0){
         fflush (stdin);
         if (isUserExists(tmpID))
             printf ("!!! Пользователь с таким id уже существует. \n");
         if (tmpID < 0)
             printf ("!!! ID пользователя не может быть отрицательным! \n");
         printf("Введите id пользователя: ");
         scanf ("%d", &tmpID);
     }
     u -> id = tmpID;
     fflush(stdin);
     printf("Введите имя пользователя: ");
     gets(tmpLogin);
     fflush(stdin);
     while (isUserExistsLogin(tmpLogin)){
         printf ("!!! Пользователь с таким именем уже существует. \n");
         printf("Введите имя пользователя: ");
         gets(tmpLogin);
         fflush(stdin);
     }
     strcpy(u -> login, tmpLogin);
     printf("Введите пароль пользователя: ");
     scanf ("%s", &tmpPass);
     printf ("Введите пароль повторно: ");
     scanf ("%s", &tmpPass2);
     while (strcmp(tmpPass, tmpPass2) != 0){
         if (strcmp(tmpPass, tmpPass2) != 0)
             printf ("!!! Пароли не совпадают!\n");
         printf("Введите пароль пользователя: ");
         scanf ("%s", &tmpPass);
         fflush (stdin);
         printf ("Введите пароль повторно: ");
         scanf ("%s", &tmpPass2);
     }
     hashPass = md5(tmpPass);
     strcpy(u->password, hashPass.c_str());
     printf("\n");
     return *u;
 }

当我添加第一个节点时,一切正常。

但是当我添加 2nd 和其他时,我在 p-&gt;next = *userStack; 行中遇到了麻烦。 此行正确更改了指针,但在password 的末尾添加了垃圾。

那是我的麻烦。 谢谢。

【问题讨论】:

  • user *p = new user;”。您是要标记此c 还是c++
  • 请出示enterUser()的代码
  • user *p = new user; 后跟 *p = enterUser(); 强烈建议您覆盖第一个 *p 值。
  • 您的enterUser() 存在内存泄漏。您分配内存,并且永远不要将new 返回的指针值保存在任何地方,以便以后可以释放它。你真的应该返回 user 而不是 user *

标签: c pointers linked-list


【解决方案1】:

问题出在密码数组中。增加长度解决了它。

感谢代码优化建议。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多