C语言Pointer拷贝异常问题:编译器代码中ef操作意外修改原指针e
问题根因
你观察到的原指针e的内容发生变动,和ef = ef->next没有关系,这段代码修改的是指针变量ef本身的指向,ef是函数栈上独立于e的局部变量,对它本身赋值不会影响入参e的取值。
真正导致e指向内容被修改的是你内层循环的这行代码:
ef->bindings = ef->bindings->next;
ef和e指向的是同一个FRAME结构体实例,你通过ef指针修改结构体内部的bindings成员,相当于直接修改了e指向的FRAME对象的头指针,这才是原数据被改动的核心原因。你在遍历链表的时候直接修改了链表的头节点,相当于把原链表拆毁了,后续再访问e对应的FRAME时,bindings已经指向了链表末尾的NULL,自然会觉得"e的值变了"。
修复方案
遍历bindings链表时不要直接修改结构体的头指针,额外声明一个临时遍历指针完成遍历即可,修改后的代码如下:
CLOSURE *find_func(TOKEN* name, FRAME* e){ FRAME *ef = e; while(ef != NULL){ // 用临时指针遍历bindings,不修改原结构体的头指针 BINDING *cur_binding = ef->bindings; while (cur_binding != NULL){ if(cur_binding->name == name){ return cur_binding->value->closure; } cur_binding = cur_binding->next; } ef = ef->next; } printf("No function %s in scope, exiting...\n",name->lexeme);exit(1); }
这样修改后,遍历过程不会修改任何FRAME、BINDING结构体的原有内容,入参e的指向和对应内容都不会被改动。
内容的提问来源于stack exchange,提问作者e god
相关产品推荐
相关产品推荐

