我有一个父结构,其中包含一个子结构,还有一个指向该子的并集的指针。我的问题是,下面的示例代码可以正常工作,直到我想将指向我的父结构的指针指向我的父结构的另一个实例时,此时我的内部指针似乎断开并导致了段错误。我可以通过每次更改父级指向的位置时更新内部指针来解决此问题,但希望避免这种情况。我以为,由于内部结构没有更改,因此仍将内部指针设置为指向新的父地址的正确偏移量,但看来我弄错了吗?
有人可以帮我吗,下面有示例代码(请忽略我的示例的毫无意义,我的情况要复杂得多,有一定的原因,但是示例说明了我的问题)。
这是我的情况的简化版本:
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->child
和parent_ptr->union->a
段错误。
每次更改parent_ptr->union
时,是否可以将正确的内存地址重新分配给parent_ptr
?
感谢您的帮助!
答案 0 :(得分:1)
您的问题的答案是:否!您无法重新分配示例。
使用绝对指针还是相对指针都没有关系。 指针算术对您没有帮助。
在您的示例中,您(静态地在堆栈上)分配了2个单独的结构:
parent
和parent2
。
它们每个都占用单独的存储区,并且每个存储区都有一个union
指针。完全独立的union
指针!
在您的代码中,初始化属于union
的{{1}}指针。
但是,然后,您尝试访问属于parent
的{{1}}指针。
您没有初始化的对象,因此会遇到分段错误。
让我们进一步简化示例事件:
union
这仍然会出现段错误。而且这段代码与您尝试的完全相同。
对指针所做的任何操作都不会自动同时自动初始化两个单独的变量...
答案 1 :(得分:0)
您已经声明了parent2
,但尚未初始化它。此外,通过提供的示例代码,您还没有为malloc()
分配任何空间。没有看到您的实际代码,我无法真正告诉您您要去哪里哪里。也许您正在分配空间或已初始化parent2
,但未显示。