You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 13:15:09