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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 05:22:20