【问题标题】:Linked List in C Trouble with StringsC 中的链表与字符串有关的问题
【发布时间】:2012-02-29 22:31:55
【问题描述】:

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

    }   
}

【问题讨论】:

  • 你的错误不是指针,而是指针指向的内容。你需要了解动态内存分配;我建议拿起一本好书和一杯咖啡。
  • 你的add 函数看起来没问题,所以我猜问题是你用相同的第二个参数调用add。如果不是这种情况,请提供更多信息:您如何调用您的 add 函数?
  • 天啊,现在的孩子们怎么了,他们需要 typedef 甚至是简单的非透明数据类型?

标签: c


【解决方案1】:

您需要创建字符串的副本。

即在添加功能中,您需要该行

node->command = strdup(c);

此外,您必须释放此字符串以防止在释放节点时发生内存泄漏。

【讨论】:

    【解决方案2】:
    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)。

    【讨论】:

      【解决方案3】:

      我从不知道可以使用“=”运算符将字符串分配给另一个:P 这可能适用于结构变量,但不适用于字符串。在将大小动态分配给 node->command 后尝试使用 strcpy(node->command, c)。这应该工作! :)

      【讨论】:

        猜你喜欢
        • 2021-01-10
        • 1970-01-01
        • 1970-01-01
        • 2022-01-05
        • 1970-01-01
        • 2010-12-07
        • 2021-12-19
        • 2016-07-23
        • 2021-11-26
        相关资源
        最近更新 更多