1

我需要 C 中指针的帮助。我有两个结构,一个结构是这样的:

    typedef struct s{
        s2** d;
        struct s* next;
    }s;


 typedef struct s2{
        c* fi;
        struct s2* next;
    }s2;

我有一个这样的功能:

void modify(c* a, s2* b){   //c* is a pointer to a struct
    s* rd = malloc(sizeof(s);
    rd->next = NULL;
    //need also to initialize the field "d" of the "s" struct
}

这会产生错误。我需要结构 rd 指向 b ,如示例中所示。我需要存储一个双指针,因为 s2 以类似列表的方式链接,所以我需要 ** 指针才能删除列表的第一个元素。我在 rd->d = &b 之类的评论中进行了赋值,但是当我尝试在函数中尊重字段“d”时,我读取的内存无效,我不明白为什么。

4

1 回答 1

1

我想问题是这样的:

s2* b您作为参数传入modify,因此该指针驻留在堆栈上。现在,当您分配 时rd->d = &b,您将在堆栈上获取该位置,该位置仅在执行离开modify. 因此,当您rd->d稍后取消引用时,您会访问堆栈上的那个(现在无效的)位置,这会产生垃圾或崩溃。(但是,在这种情况下,您应该能够rd->d在仍处于 . 时正确取消引用modify。)

可能您想更改b传递给 modify 的方式,最有可能s2** bs2类似.s2modify

基本上是这样的:

void modify(c* a, s2** b) {
    s* rd = malloc(sizeof(s));
    rd->next = NULL;
    rd->d = b;
}

并称它为

s2* myS2 = ...;
modify(<whatever>, &myS2->next);

这应该允许您将指针的位置传递给一个s2实例,您可以将其存储起来并在modify完成后取消引用(尽管未经测试)。

于 2011-03-19T14:29:32.753 回答