2012-02-29 123 views
2

我想创建一个链接列表与头部和尾部节点在C.每个节点需要保存一个int和一个字符串。我的问题是,当我创建一个新节点时,为其分配正确的值,并将其添加到列表的末尾。所有先前的节点都获得我分配最新节点的字符串。 int值保持正确,但它的像char指针被重新分配。我猜测我正在用指针做一些错误的事情,并且在网上查看了大量的例子,并且无法看到我要出错的地方。我包含了我的节点结构和添加功能。感谢所有的帮助!链接列表在C与字符串麻烦

// 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

你错了不是指针,而是指针指向什么。您需要了解动态内存分配;我建议拿起一本好书和一杯咖啡。 – 2012-02-29 22:34:13

+0

你的'add'函数看起来不错,所以我想问题是你用相同的第二个参数调用'add'。如果情况并非如此,请提供更多信息:您如何调用您的“添加”功能? – sirgeorge 2012-02-29 22:38:04

+0

Geez,这些天和孩子们在一起,他们需要typedef甚至是简单的,不透明的数据类型? – tbert 2012-03-01 04:53:32

回答

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); 

或者因为你必须调用strlen上c可以使用更高效:

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

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

即在附加功能,您需要行

node->command = strdup(c); 

此外,你将不得不释放这个字符串,以防止内存泄漏,当你释放的节点。

0

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