C 为什么我总是覆盖链接列表中指向的内容?

C 为什么我总是覆盖链接列表中指向的内容?,c,pointers,linked-list,C,Pointers,Linked List,对于客户机-服务器模式,我希望将所有登录用户及其文件描述符一起“保存”到一个链接列表中。我试着做到以下几点: 当用户输入登录命令时,它返回他或她选择的用户名。 然后,它将这个用户名添加到一个链接列表中 char* username = login(clientSocket, message); addUser(username, clientSocket); 将用户名和套接字添加到链接列表的操作如下: typedef struct UserSocketNode {

对于客户机-服务器模式,我希望将所有登录用户及其文件描述符一起“保存”到一个链接列表中。我试着做到以下几点:

当用户输入登录命令时,它返回他或她选择的用户名。 然后,它将这个用户名添加到一个链接列表中

      char* username = login(clientSocket, message);
      addUser(username, clientSocket);
将用户名和套接字添加到链接列表的操作如下:

typedef struct UserSocketNode {
    int userSocket;
    char* username;
    struct UserSocketNode* next;
}UserSocketNode;

UserSocketNode *head = NULL;

void addUser(char* username, int userSocket) {
    UserSocketNode *newNode = (UserSocketNode*) malloc(sizeof(UserSocketNode));
    newNode->username = (char*)malloc(strlen(username) + 1);

    newNode->userSocket = userSocket;
    strcpy(newNode->username, username);

    newNode->next = head;
    head = newNode;
}
每当我打印链接列表的内容时,每个节点都有相同的用户名,我不知道为什么。这对我来说很有意义,通过为节点分配内存,我不会为保存用户名的char数组分配内存,每个节点都会指向相同的用户名。我想通过显式地为用户名分配内存并将char数组的内容复制到newNode->username来解决这个问题,但这不起作用


谁能给我指点一下我错在哪里。

基本上,你的方法没有错。你在别的地方有个虫子

链表节点包含两个数据元素和下一个指针

typedef struct UserSocketNode {
    int userSocket;
    char* username;
    struct UserSocketNode* next;
} UserSocketNode;
您有一个
UserSocketNode
的列表,称之为指示它是什么的东西。我会保留一个head&tail,并在tail添加,但那就是我

UserSocketNode* UserSocketList = NULL;
我会通过这个列表(有点像一个this/self),但是嘿。。。 不管怎样,为什么不使用strdup呢

void UserSocketListadd(char* username, int userSocket)
{
    //need a new node
    UserSocketNode* node = (UserSocketNode*) malloc(sizeof(UserSocketNode));
    if( !node ) return; //error...
    //initialize
    node->userSocket = userSocket;
    node->username = strdup(username);

    //add to front of list
    node->next = UserSocketList;
    UserSocketList = node;
}

首先检查
username
返回的是什么
login
。如果在
strcpy
中打印
newNode->username
的内容,会发生什么情况?印刷的是什么?正是我想要的。如果我想用“user1”登录,它至少会返回指向该字符数组的指针“user1”。这个答案是针对Paul Ogilvie的问题。@Cuijpie在打印列表时尝试打印用户名的指针位置。看看指针是否不同
printf(“%p”,用户名)
-编辑-不要复制粘贴。我在手机上,引号被转换成特殊的utf引号。@Kyle谢谢你提醒我打印指针!我意识到问题不在我的代码中,而是我在makefile中犯了一个错误,导致它无法编译。完全是我的错!