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