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

时间:2018-09-19 01:46:28

标签: 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方法中两次设置节点数据。似乎都没有作用-同时,从我的主要方法写入和读取它的效果很好。我在做什么错了?

2 个答案:

答案 0 :(得分:4)

def duplicate_items(list_numbers): counts = {} new_arr = [] for nums in list_numbers: if not nums in counts: counts[nums] = 1 else: counts[nums] += 1 for k in counts: if count[k] > 1: new_arr.append(k) return sorted(new_arr) 中,您将本地变量的地址存储在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; };

答案 1 :(得分:1)

对于初学者来说,您必须按照自己的方式为节点分配内存,节点是堆栈上的局部变量,函数退出后很可能会被覆盖。

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