指向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…()
返回一个指向局部变量的指针