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

C语言递归字符串复制函数出现写入访问违规且无法终止问题

解决递归字符串复制函数的写入访问违规与终止问题

嘿,我来帮你排查这个递归字符串复制函数的问题~你的代码里有几个关键错误导致了现在的异常,咱们一步步来梳理:

问题分析

  • 字符串终止符写错了:C语言里的字符串结束标记是'\0'(反斜杠+0),但你代码里全写成了'/0'(斜杠+0)。这个错误会让程序永远找不到字符串的结束位置,因为str1[index]永远不会等于错误的'/0'。
  • 递归函数误用while循环:递归的逻辑是通过自身调用逐步推进任务,你在递归函数里加了while循环,每次进入函数就会触发循环,然后递归调用下一层,完全没有退出的机会。这会导致index不断增大,直接越界访问数组以外的内存,最终触发写入访问违规。
  • 原字符串未正确终止:你用字符列表初始化str1时,没有手动添加'\0',这样str1并不是一个合法的C字符串,程序无法识别它的结束位置。

修正后的代码

#include <stdio.h>
void copy(char*, char*, int);
int main() {
    // 给str1手动添加合法的字符串终止符
    char str1[10] = { 'H', 'e', 'j', 'h', 'e', 'j', '\0' };
    // 修正终止符写法,初始化str2为空字符串
    char str2[10] = { '\0' };
    copy(str1, str2, 0);
    // 用%s格式符打印字符串,更规范安全
    printf("%s", str2);
    getchar();
    return 0;
}

void copy(char* str1, char* str2, int index) {
    // 用if判断终止条件,替代原来的while循环
    if (str1[index] != '\0') {
        // 复制当前索引的字符
        str2[index] = str1[index];
        // 递归调用,处理下一个索引
        copy(str1, str2, index + 1);
    } else {
        // 给目标字符串添加终止符,确保它是合法的C字符串
        str2[index] = '\0';
    }
}

修正说明

  1. 修正终止符:把所有'/0'替换为'\0',让程序能正确识别字符串的结束位置。
  2. 替换while为if:递归函数只需要判断当前字符是否为终止符,是则给目标字符串加终止符并结束;否则复制字符后递归处理下一个索引,避免无限递归。
  3. 确保原字符串合法:给str1手动添加'\0',让它成为标准的C字符串。
  4. 规范printf用法:使用%s格式符打印字符串,比直接传字符串更安全规范。

这样修改后,递归函数就能正常终止,也不会再出现内存访问违规的问题啦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:22:14