繁体   English   中英

指向C中结构的指针

[英]pointer to a structure within a structure in C

我有一个结构(我们称它为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;
}

这是一些猜测。

如果您正在某个函数中修改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 * pointer”将指向一块内存,当您更改上下文时,该内存将消失。 分配Structure2变量并在不再需要它时将其释放

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM