c - 我可以从一个位置更改结构成员,但不能从另一个位置更改结构成员

标签 c pointers struct member

我正在尝试用 C 实现一个链表 - 从简单开始,一个列表包含一个节点。但是,我在尝试向节点添加数据时偶然发现了一些问题。到目前为止,这是我的实现:

struct mylist_node {
  int data;
};

struct mylist {
  struct mylist_node *head_pt;
};

void mylist_init(struct mylist* l){
    struct mylist_node head_node;
    head_node.data = 5; //First try
    l->head_pt = &head_node;
    l->head_pt->data = 5; //Second try
};

还有我的主要方法:

int main()
{
    struct mylist ml, *ml_pointer;
    ml_pointer = &ml;
    mylist_init(ml_pointer);

    printf("%d\n", ml_pointer->head_pt->data);
    ml_pointer->head_pt->data = 4;
    printf("%d\n", ml_pointer->head_pt->data);

    return 0;
}

这应该打印出来

5
4

如果我对指针的了解是正确的。然而,它打印出来

0
4

如您所见,我尝试在 mylist_init 方法中设置节点数据两次。两者似乎都不起作用 - 同时,从我的主要方法写入和读取它工作得很好。我做错了什么?

最佳答案

mylist_init 中,您将局部变量的地址存储在 l 指向的结构中。当函数返回时,该变量超出范围,因此它占用的内存不再有效,因此先前指向它的指针现在指向无效位置。返回局部变量的地址,取消引用该地址会调用未定义的行为。

您的函数需要使用 malloc 动态分配内存,以便函数返回时内存仍然有效。

void mylist_init(struct mylist* l){
    struct mylist_node *head_node = malloc(sizeof(*head_node));
    l->head_pt = head_node;
    l->head_pt->data = 5; 
};

此外,不要忘记在使用完内存后释放内存。

关于c - 我可以从一个位置更改结构成员,但不能从另一个位置更改结构成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52396843/

相关文章:

C# 将大型结构编码到 C DLL

c - 按字符串长度对动态分配的字符串数组进行 Qsort

c - 通过引用传递字符串数组以在 C 中运行和修改内容

c - 跳过c中的代码行

c++ - 具有堆栈分配的 C++ 类的 C 包装器

c - c 中的链接列表,代码行的解释?

c++ - 在 C++ 中返回一个对象(或结构)

C:将嵌套结构数组传递给函数

c - 在结构中使用结构..无法访问内部结构元素?

c++ - 使用 fscanf 读取双倍