我有一个结构(让我们称之为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 *指针)的方式
PCB *pcb_createFromScript(const char *script){
t_medatada_program *metadata = metadatada_desde_literal(script);
PCB *pcb = malloc(sizeof(PCB));
pcb->instructionCount = metadata->instrucciones_size;
pcb->tagCount = metadata->cantidad_de_etiquetas;
pcb->functionCount = metadata->cantidad_de_funciones;
int codeSegmentSize = strlen(script);
int tagIndexSize = 0;
if(metadata->etiquetas != 0){
tagIndexSize = strlen(metadata->etiquetas);
}
int instructionIndexSize = metadata->instrucciones_size * sizeof(t_intructions);
pcb_getSegments(pcb,1024,codeSegmentSize,tagIndexSize,instructionIndexSize);
pcb->currentContext = pcb->stackSegment;
pcb->variableCounter = 0;
memory_write(pcb->codeSegment,0,codeSegmentSize,script);
memory_write(pcb->tagIndexSegment,0,tagIndexSize,metadata->etiquetas);
memory_write(pcb->instructionIndexSegment,0,instructionIndexSize,(void *)metadata->instrucciones_serializado);
pcb->uniqueId = (int) random();
return pcb;
}
然后我以这种方式分配(myCPU是全局的),这就是为什么我在cpu_getPCB
内调用它而不将其作为参数传递
cpu_getPCB(*dummyPCB);
void cpu_getPCB(PCB myPCB){
myCPU.currentContext = myPCB.currentContext;
myCPU.assignedPCB = &myPCB;
}
答案 0 :(得分:2)
这是一些猜测。
如果要修改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;
}
答案 1 :(得分:1)
" structure2 *指针"将指向一块内存,当你改变上下文时它会消失。分配Structure2变量并在不再需要时释放它