父指针更改后,子指针出现段错误

时间:2018-12-14 20:08:16

标签: c

我有一个父结构,其中包含一个子结构,还有一个指向该子的并集的指针。我的问题是,下面的示例代码可以正常工作,直到我想将指向我的父结构的指针指向我的父结构的另一个实例时,此时我的内部指针似乎断开并导致了段错误。我可以通过每次更改父级指向的位置时更新内部指针来解决此问题,但希望避免这种情况。我以为,由于内部结构没有更改,因此仍将内部指针设置为指向新的父地址的正确偏移量,但看来我弄错了吗?

有人可以帮我吗,下面有示例代码(请忽略我的示例的毫无意义,我的情况要复杂得多,有一定的原因,但是示例说明了我的问题)。

这是我的情况的简化版本:

typedef struct mychildstruct
{
   uint16_t member
}mychildstruct;

typedef union myunion
{
   mychildstruct child;
   uint16_t a;
}myunion;

typedef struct myparentstruct
{
   mychildstruct child;
   myunion *union;
}myparentstruct;

myparentstruct parent;
myparentstruct *parent_ptr;

parent_ptr = (myparentstruct *)&parent;
parent_ptr->union = (myunion *)&parent.child;

这里没有问题,对parent_ptr->union->child的读取或写入均可以正常工作,并且可以正确地指向与parent_ptr->union->a相同的存储位置。但是,如果我这样做:

myparentstruct parent2;

parent_ptr = (myparentstruct *)&parent2;

然后进行parent_ptr->union->childparent_ptr->union->a段错误。

每次更改parent_ptr->union时,是否可以将正确的内存地址重新分配给parent_ptr

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

您的问题的答案是:否!您无法重新分配示例。

使用绝对指针还是相对指针都没有关系。 指针算术对您没有帮助。

在您的示例中,您(静态地在堆栈上)分配了2个单独的结构:
parentparent2

它们每个都占用单独的存储区,并且每个存储区都有一个union指针。完全独立的union指针!

在您的代码中,初始化属于union的{​​{1}}指针。 但是,然后,您尝试访问属于parent的{​​{1}}指针。 您没有初始化的对象,因此会遇到分段错误。

让我们进一步简化示例事件:

union

这仍然会出现段错误。而且这段代码与您尝试的完全相同。

对指针所做的任何操作都不会自动同时自动初始化两个单独的变量...

答案 1 :(得分:0)

您已经声明了parent2,但尚未初始化它。此外,通过提供的示例代码,您还没有为malloc()分配任何空间。没有看到您的实际代码,我无法真正告诉您您要去哪里哪里。也许您正在分配空间或已初始化parent2,但未显示。