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

C语言递归调用时保留字匹配指针未复位到数组首地址问题求解

问题根因

你在内层字符匹配循环中直接修改了reserved数组存储的保留字字符串指针,原始保留字的起始地址被永久改变,后续即使重置遍历指针r指向数组起始位置,也无法读到原始的保留字首字符。
具体逻辑如下:

  • reserved数组中存储的是指向字符串字面量"char"的指针,初始状态下reserved[0]指向字符'c'
  • 内层匹配循环中执行的(*r)++操作,会直接修改reserved[0]本身的地址值:当匹配ctype的首字符'c'时,*w == **r条件成立,(*r)++会将reserved[0]的指针向后偏移1字节,指向字符'h'
  • reserved数组在main函数中定义,递归调用getvar时传递的是同一个数组的地址,之前对reserved[0]的修改会被全局保留
  • 递归调用时执行r = reserved仅会将遍历指针r重新指向数组第一个元素,但此时数组第一个元素reserved[0]本身已经偏移到'h'的地址,因此**r读到的是'h'而非预期的'c'

同时补充:直接修改字符串字面量的指针属于C标准规定的未定义行为,即使没有出现当前问题也存在崩溃风险。

修复方案

匹配保留字时使用临时指针遍历字符串,不修改原始reserved数组的内容,将原有内层循环逻辑修改为:

for(w = word, r = reserved; *r!= NULL; w=word, r++) {
    // 用临时指针做匹配,不修改原始保留字指针
    const char *tmp_r = *r;
    char *tmp_w = w;
    for (; *tmp_w == *tmp_r; tmp_r++, tmp_w++) {
        if (*tmp_w == '\0') {
            // 原有匹配成功后的逻辑保持不变
            getchar();
            for (v = var, (c=getchar()) =='*'? c = getchar(): c;  c != ';' && c != '['; *v = '\0', c = getchar())
                *v++ = c;
            return var;
        }
    }
}

内容的提问来源于stack exchange,提问作者Haznut

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 02:24:03