gpt4 book ai didi

c - 为什么我需要使用 strdup()?

转载 作者:行者123 更新时间:2023-12-02 07:57:33 38 4
gpt4 key购买 nike

typedef struct Node {
char *word;
struct Node *next;
} Node;

Node* newNode(char *word) {

Node *n = malloc(sizeof(Node));
n->word = word;
n->next = NULL;
return n;
}

在这段代码(单链表)中,如果我创建了许多节点,它们都具有最后一个节点的名称,我需要了解为什么在 newNode 函数中我需要使用 strdup() 函数,当我搜索解决方案时,在这行代码中 n->word = strdup(word); 并在堆中创建 word 的副本。

如果我使用 malloc(sizeof(Node)); 这意味着在堆中为该节点保留一个位置,因此每个节点都应该是独立的,为什么它们共享最后一个节点的名称?

最佳答案

您的节点只包含一个指针,该指针需要指向内存中存储您的实际单词的某个位置。

也许这个例子可以帮助你理解。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct Node {
char *word;
struct Node *next;
} Node;

Node* newNode(char *word)
{
Node *n = malloc(sizeof(Node));
n->word = word;
n->next = NULL;
return n;
}

Node* insertNode(Node* head, Node* n)
{
n->next = head;
return n;
}

void printList(Node* head)
{
while(head)
{
printf("%s\n", head->word);
head = head->next;
}
}

int main(void) {

// Step 1: Create a list that "works" due to use of string literals
Node* head1 = NULL;
head1 = insertNode(head1, newNode("world"));
head1 = insertNode(head1, newNode("hello"));
head1 = insertNode(head1, newNode("test"));
printList(head1);

printf("------------------------------------------------\n");

// Step 2: Create a list that "fails" due to use of a char array
Node* head2 = NULL;
char str[20];
strcpy(str, "test");
head2 = insertNode(head2, newNode(str));
strcpy(str, "hello");
head2 = insertNode(head2, newNode(str));
strcpy(str, "world");
head2 = insertNode(head2, newNode(str));
printList(head2);

printf("------------------------------------------------\n");

// Step 3: Change the value that head2 nodes points to
strcpy(str, "What!!");
printList(head2);

return 0;
}

输出:

test
hello
world
------------------------------------------------
world
world
world
------------------------------------------------
What!!
What!!
What!!

第一步:

head1 列表按预期工作,因为每个节点都使用指向存储在内存中某处的字符串文字的指针进行初始化。每个字符串文字都存储在不同的内存中。因此它工作正常。

第 2 步:

head2 列表没有像您预期的那样工作。这是因为每个节点都使用 str 初始化,所以所有节点都简单地指向 str 数组。因此,所有节点都指向“world”,即复制到 str 中的最后一个单词。

第 3 步:

然后是一个新词,即“什么!!”被复制到 str 数组中,现在每个节点将再次打印 str 的内容,即“What!!”。

结论:

这完全取决于您如何调用 newNode

如果每次都使用指向某个新内存的指针调用它,则不需要将单词复制到新位置(或使用 strdup)。

但是,如果您在调用 newNode 时重用缓冲区,则需要将副本复制到 newNode(和 strdup是进行该复制的一种方式)

关于c - 为什么我需要使用 strdup()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61750304/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com