C字符串中的链接列表

时间:2012-02-29 22:31:55

标签: c

我正在尝试在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;

    }   
}

3 个答案:

答案 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)。这应该工作! :)