我正在尝试在C中创建一个带有头部和尾部节点的链表。每个节点都需要保存一个int和一个字符串。我的问题是,当我创建一个新节点时,为其分配正确的值,并将其添加到列表的末尾。所有先前的节点都获取我分配给最新节点的字符串。 int值保持正确,但它的char指针被重新分配。我猜我在使用指针做了一些错误,并且在网上看了很多例子,看不出我哪里出错了。我包含了我的节点结构和添加功能。感谢您的帮助!!
// Linked list (queue) for requests
typedef struct request {
struct request *next;
int request_id;
char *command;
} request_t;
// Global variables
request_t *head = NULL;
request_t *tail = NULL;
void add(int r_id, char *c) {
request_t *node = NULL;
node = (request_t *)malloc(sizeof(request_t));
node->request_id = r_id;
node->command = c;
node->next = NULL;
if(head == NULL) {
head = node;
tail = node;
} else {
tail->next = node;
tail = node;
}
}
答案 0 :(得分:3)
您需要创建字符串的副本。
即。在添加功能中,您需要行
node->command = strdup(c);
此外,您必须释放此字符串以防止释放节点时出现内存泄漏。
答案 1 :(得分:1)
node->command = c;
应该是这样的:
// Allocate enough memory for a copy of the string pointed to by c
node->command = malloc(strlen(c) + 1);
// Copy the string pointed to by c, to the newly allocated memory
strcpy(node->command, c);
或者,因为你必须在c上调用strlen
,你可以使用更高效的:
size_t num_bytes = strlen(c) + 1;
// Allocate enough memory for a copy of the string pointed to by c
node->command = malloc(num_bytes);
// Copy num_bytes bytes from the memory pointed to by c, to the newly allocated memory
memcpy(node->command, c, num_bytes);
这样你就可以复制字符串了。应修改删除功能以释放分配的内存:
free(node->command);
您的代码出了什么问题?
如果不复制字符串,只需复制指针即可,因此如果调用add(10, somestr);
则somestr为char *
(指针)。如果修改该内存位置的字符串,它也会在链表中被修改,因为实际上只有一个字符串有两个指针(command和somestr)。
答案 2 :(得分:0)
我从来不知道可以使用'='运算符将字符串分配给另一个字符串:P这可能适用于结构变量,但不适用于字符串。在动态地将大小分配给node->命令之后,尝试使用strcpy(node->命令,c)。这应该工作! :)