Access violation reading异常求助:代码中while (*a != '\0')疑存问题
Access Violation Reading异常的原因及修复
核心问题分析
你遇到的Access Violation是指针越界访问非法内存导致的,和while (*a != '\0')本身无关,只是这个循环在访问非法内存时触发了异常,根源在move函数的指针操作和递归逻辑上:
- 指针被意外修改:
if (my_strlen(a++) >= 2)中的a++会修改函数内的a指针。执行完这行后,a已经指向原地址的下一个位置,后续*(a + right) = temp的计算地址会超出数组合法范围,访问不属于当前数组的内存。 - 递归地址混乱:递归调用
move(a + 1)时,因前面的a++,实际传入的指针是原指针+2,而非预期的原指针+1,导致递归处理的字符串位置完全错误。 - 恢复操作地址错误:递归返回后,用已偏移的
a加上初始计算的right,指向的是完全错误的内存区域,写入操作直接触发内存访问异常。
修复后的代码
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> int my_strlen(char* a); void move(char* a); int main() { char a[100]; scanf("%s", a); move(a); printf("%s", a); return 0; } int my_strlen(char* a) { int count = 0; while (*a != '\0') { count++; a++; } return count; } void move(char* a) { int len = my_strlen(a); // 长度小于2时无需递归处理 if (len < 2) { return; } int right = len - 1; char temp = *a; // 暂存末尾字符并截断字符串 char last_char = *(a + right); *(a + right) = '\0'; // 递归处理去掉首字符后的子串 move(a + 1); // 把原首字符放到末尾 *(a + right) = temp; }
关键修改点
- 提前计算字符串长度
len,避免重复调用my_strlen,同时判断长度小于2时直接返回,终止递归。 - 移除
a++操作,递归时直接传入a + 1,保证指针指向正确的子串起始位置。 - 调整字符串截断和恢复的逻辑,确保恢复操作使用初始指针
a和正确的right偏移量,彻底避免越界。
验证说明
输入abcd时,修复后的代码会将首字符移到末尾,输出bcda,同时不会触发任何内存访问异常。
内容的提问来源于stack exchange,提问作者Aida111111111
相关产品推荐
相关产品推荐

