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'; } }
修正说明
- 修正终止符:把所有
'/0'替换为'\0',让程序能正确识别字符串的结束位置。 - 替换while为if:递归函数只需要判断当前字符是否为终止符,是则给目标字符串加终止符并结束;否则复制字符后递归处理下一个索引,避免无限递归。
- 确保原字符串合法:给
str1手动添加'\0',让它成为标准的C字符串。 - 规范printf用法:使用
%s格式符打印字符串,比直接传字符串更安全规范。
这样修改后,递归函数就能正常终止,也不会再出现内存访问违规的问题啦~
内容的提问来源于stack exchange,提问作者Jacob Bergqvist
相关产品推荐
相关产品推荐

