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中犯了一个错误,导致它无法编译。完全是我的错!