指向C中结构中的结构的指针

指向C中结构中的结构的指针,c,pointers,struct,C,Pointers,Struct,我有一个结构(我们称之为structure1),它持有指向另一个结构(structure2)的指针 typedef struct structure{ structure2 *pointer }structure; structure structVariable; structVariable.pointer = functionThatReturnsAPointerToStructure2Variable(); 问题是,随着程序更改上下文(例如,调用函数时),以下代码的返回值也会

我有一个结构(我们称之为
structure1
),它持有指向另一个结构(
structure2
)的指针

typedef struct structure{
    structure2 *pointer
}structure;

structure structVariable;
structVariable.pointer = functionThatReturnsAPointerToStructure2Variable();
问题是,随着程序更改上下文(例如,调用函数时),以下代码的返回值也会更改

structVariable.pointer->someAttribute
你知道为什么会这样吗?如果您需要更多信息,请询问。谢谢

更多信息

这才是真正的交易

结构将是这样的

typedef struct CPU{
    int variableCounter;
    int instructionPointer;
    char *currentInstruction;
    t_list *dataDictionary_list;
    u_int32_t currentContext;
    PCB *assignedPCB;
    CPU_STATUS status;
}CPU;
这就是我分配指针的方式(PCB*指针)

}

然后我这样分配它(myCPU是全局的),这就是为什么我在
cpu\u getPCB
内部调用它,而不将它作为参数传递

cpu_getPCB(*dummyPCB);

void cpu_getPCB(PCB myPCB){
    myCPU.currentContext = myPCB.currentContext;
    myCPU.assignedPCB = &myPCB;
}

这里有一些猜测

如果您正在修改
structVariable.pointer
在某些函数中指向的对象,那么当您尝试读取
structVariable.pointer->someAttribute
时,该值将更改以反映对对象的修改

另一种可能性,正如另一个答案所提到的,是
structVariable.pointer
指向本地内存(函数的堆栈内存),在新函数调用时很容易被覆盖。这可以通过使用
malloc
执行堆分配而不是堆栈分配来纠正


这是第一个也是最明显的问题。您正在获取参数的地址并将其分配给
myCPU.assignedPCB

由于
C
是传递值,因此您复制了它而不是捕获原始值。此外,该参数与局部变量具有相同的生存期,并在函数返回时消失

void cpu_getPCB(PCB myPCB){
    myCPU.currentContext = myPCB.currentContext;
    myCPU.assignedPCB = &myPCB;
}
您可以通过传递一个指针来修复它,因为您处于
C
中,并且无权访问引用类型

void cpu_getPCB(PCB* myPCB){
    myCPU.currentContext = myPCB->currentContext;
    myCPU.assignedPCB = myPCB;
}

这里有一些猜测

如果您正在修改
structVariable.pointer
在某些函数中指向的对象,那么当您尝试读取
structVariable.pointer->someAttribute
时,该值将更改以反映对对象的修改

另一种可能性,正如另一个答案所提到的,是
structVariable.pointer
指向本地内存(函数的堆栈内存),在新函数调用时很容易被覆盖。这可以通过使用
malloc
执行堆分配而不是堆栈分配来纠正


这是第一个也是最明显的问题。您正在获取参数的地址并将其分配给
myCPU.assignedPCB

由于
C
是传递值,因此您复制了它而不是捕获原始值。此外,该参数与局部变量具有相同的生存期,并在函数返回时消失

void cpu_getPCB(PCB myPCB){
    myCPU.currentContext = myPCB.currentContext;
    myCPU.assignedPCB = &myPCB;
}
您可以通过传递一个指针来修复它,因为您处于
C
中,并且无权访问引用类型

void cpu_getPCB(PCB* myPCB){
    myCPU.currentContext = myPCB->currentContext;
    myCPU.assignedPCB = myPCB;
}

这里有一些猜测

如果您正在修改
structVariable.pointer
在某些函数中指向的对象,那么当您尝试读取
structVariable.pointer->someAttribute
时,该值将更改以反映对对象的修改

另一种可能性,正如另一个答案所提到的,是
structVariable.pointer
指向本地内存(函数的堆栈内存),在新函数调用时很容易被覆盖。这可以通过使用
malloc
执行堆分配而不是堆栈分配来纠正


这是第一个也是最明显的问题。您正在获取参数的地址并将其分配给
myCPU.assignedPCB

由于
C
是传递值,因此您复制了它而不是捕获原始值。此外,该参数与局部变量具有相同的生存期,并在函数返回时消失

void cpu_getPCB(PCB myPCB){
    myCPU.currentContext = myPCB.currentContext;
    myCPU.assignedPCB = &myPCB;
}
您可以通过传递一个指针来修复它,因为您处于
C
中,并且无权访问引用类型

void cpu_getPCB(PCB* myPCB){
    myCPU.currentContext = myPCB->currentContext;
    myCPU.assignedPCB = myPCB;
}

这里有一些猜测

如果您正在修改
structVariable.pointer
在某些函数中指向的对象,那么当您尝试读取
structVariable.pointer->someAttribute
时,该值将更改以反映对对象的修改

另一种可能性,正如另一个答案所提到的,是
structVariable.pointer
指向本地内存(函数的堆栈内存),在新函数调用时很容易被覆盖。这可以通过使用
malloc
执行堆分配而不是堆栈分配来纠正


这是第一个也是最明显的问题。您正在获取参数的地址并将其分配给
myCPU.assignedPCB

由于
C
是传递值,因此您复制了它而不是捕获原始值。此外,该参数与局部变量具有相同的生存期,并在函数返回时消失

void cpu_getPCB(PCB myPCB){
    myCPU.currentContext = myPCB.currentContext;
    myCPU.assignedPCB = &myPCB;
}
您可以通过传递一个指针来修复它,因为您处于
C
中,并且无权访问引用类型

void cpu_getPCB(PCB* myPCB){
    myCPU.currentContext = myPCB->currentContext;
    myCPU.assignedPCB = myPCB;
}

“structure2*指针”将指向一段内存,当您更改上下文时,该内存将消失。分配Structure2变量并在不再需要时释放它

当您更改上下文时,“Structure2*指针”将指向将消失的内存块。分配Structure2变量并在不再需要时释放它

当您更改上下文时,“Structure2*指针”将指向将消失的内存块。分配Structure2变量并在不再需要时释放它

当您更改上下文时,“Structure2*指针”将指向将消失的内存块。分配Structure2变量并在不再需要时释放它

如果看不到完整的测试用例,我们只能推测。听起来像是
函数returnsapointer…()
返回一个指向局部变量的指针