gpt4 book ai didi

复制指向函数中结构体的指针(链表)

转载 作者:行者123 更新时间:2023-11-30 16:06:45 28 4
gpt4 key购买 nike

我想创建一个没有全局变量的单个链表。我用 NULL 初始化了第一个元素,然后想将第一个元素 node 复制到 list_。它被复制到函数中,但副作用不起作用。在我的主函数中,该值仍然是NULL。如果我在 add_element() 函数中返回结构,一切正常,但是,是否有可能 l 在不更改函数结构和结构本身的情况下获取节点的值?

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

struct list {
int value;
struct list *next;
};


struct list *initialize(void)
{
struct list * l = NULL;
return l;
}

int add_element(struct list *list_, void *v)
{
struct list *node = malloc(sizeof(struct list));
node->value = *((int*)v);
node->next = NULL;

if(list_ == NULL)
{
list_ = node;
printf("list_->value = %d\n", list_->value); // correct copy
return 0;
}
//TODO if not first then add at end..
return 0;
}

int main()
{
struct list *l = initialize(); // l = NULL
int i = 10;
add_element(l,&i);
if(l == NULL) printf("l == NULL!\n");
printf("l->value = %d\n", l->value); // does not work, l is NULL
return 0;
}

最佳答案

kaylum 的评论为您指明了正确的方向。

当您在 C 中传递指针时,指针的值将复制到堆栈中,并且此副本是 add_element() 函数所引用的值。当您更改指针的值时,您正在修改放置在堆栈上的副本,而不是原始指针

如果您想更改原始指针(就好像它是通过引用而不是通过值传递一样),您需要使用双指针。

尝试这个变体:

    int add_element(struct list **list_, void *v)
{
struct list *node = malloc(sizeof(struct list));
node->value = *((int*)v);
node->next = NULL;

if(*list_ == NULL) // dereferencing the double pointer will access the original pointer
{
*list_ = node; // this will change the original pointer
printf("(*list_)->value = %d\n", (*list_)->value); // correct copy
return 0;
}
//TODO if not first then add at end..
return 0;
}

int main()
{
struct list *l = initialize(); // l = NULL
int i = 10;
add_element(&l,&i); // notice you are now passing the address of l instead of its value
if(l == NULL) printf("l == NULL!\n");
printf("l->value = %d\n", l->value); //should work now
return 0;
}

关于复制指向函数中结构体的指针(链表),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59868294/

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