gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 07:16:09 24 4
gpt4 key购买 nike

我有一个结构(我们称它为 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 *pointer)

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;
}

最佳答案

这里是一些猜测。

如果您正在修改 structVariable.pointer 在某个函数中指向的对象,那么当您尝试读取 structVariable.pointer->someAttribute 时,该值将会改变反射(reflect)对对象的修改。

另一种可能性,正如提到的另一个答案,是 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;
}

关于c - 指向 C 中结构中的结构的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24481100/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com