C语言 相同的值与不同的指针在链表?



为什么这段代码为链表中的所有节点输出相同的名称?

程序输出
Insert number of users : 
4
Mike
John
Bob
Alice
Name : Alice @ Pointer :0x874ae0 
Name : Alice @ Pointer :0x874b00 
Name : Alice @ Pointer :0x874b20 
Name : Alice @ Pointer :(nil) 

这段代码背后的思想是获取x个用户名并创建一个链表,然后在链表上循环,并使用指向下一个名称的指针打印每个名称。

typedef struct node
{
char *name;
struct node *next;
} node;
int main(void)
{
int x;
printf("Insert number of users :n"); // capture int from user
scanf("%i", &x);
char str[LENGTH];
node *n = malloc(sizeof(node));
if (n == NULL)
return 1;
node *start = n; // pointer to the start of the linked list
// loop for n times to capture names 
for (int i = 0; i < x; i++)
{
scanf("%s", str); // capture string 

n->name = str;
// reached end of loop
if (i == x-1)
n->next = NULL;
else 
n->next = malloc(sizeof(node));
n = n->next;
}
for (node *tmp = start; tmp != NULL; tmp = tmp->next)
{
printf("Name : %s @ Pointer :%pn", tmp->name, tmp->next);
}
return 0;
}

获取人名并将其插入链表的简单脚本。

在for循环语句中

n->name = str;

所有节点的数据成员名设置为数组STR的第一个字符的地址,声明为

char str[LENGTH];

所以所有的节点都指向同一个数组——也就是说,指向for循环之后这个数组中最后一个存储的字符串。

您需要为每个节点动态创建存储在数组中的字符串副本。就像

#include <string.h>
//...
n->name = malloc( strlen( str ) + 1 );
strcpy( n->name, str );

相关内容

  • 没有找到相关文章

最新更新