首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >指向C中结构中的结构的指针

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

Stack Overflow用户
提问于 2014-06-29 23:17:01
回答 2查看 187关注 0票数 0

我有一个结构(我们称之为structure1),它以这种方式保存指向另一个结构(structure2)的指针。

代码语言:javascript
复制
typedef struct structure{
    structure2 *pointer
}structure;

structure structVariable;
structVariable.pointer = functionThatReturnsAPointerToStructure2Variable();

问题是,随着程序更改上下文(例如,调用函数时),以下代码的返回值会发生变化

代码语言:javascript
复制
structVariable.pointer->someAttribute

知道为什么会发生这种事吗?如果您需要更多的信息,请询问。谢谢!

更多信息

这才是真正的

结构是这样的

代码语言:javascript
复制
typedef struct CPU{
    int variableCounter;
    int instructionPointer;
    char *currentInstruction;
    t_list *dataDictionary_list;
    u_int32_t currentContext;
    PCB *assignedPCB;
    CPU_STATUS status;
}CPU;

我就是这样分配指针的(PCB *指针)

代码语言:javascript
复制
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中调用它而不将它作为参数传递。

代码语言:javascript
复制
cpu_getPCB(*dummyPCB);

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

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-29 23:22:40

以下是一些猜测。

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

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

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

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

代码语言:javascript
复制
void cpu_getPCB(PCB myPCB){
    myCPU.currentContext = myPCB.currentContext;
    myCPU.assignedPCB = &myPCB;
}

您可以通过传递指针来修复它,因为您是在C中,并且没有访问引用类型的权限。

代码语言:javascript
复制
void cpu_getPCB(PCB* myPCB){
    myCPU.currentContext = myPCB->currentContext;
    myCPU.assignedPCB = myPCB;
}
票数 2
EN

Stack Overflow用户

发布于 2014-06-29 23:22:49

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24481100

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档