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

C语言调用数组移位函数后主函数dir变量自动被修改问题求解

问题根因

核心是数组越界访问触发栈内存溢出,意外覆盖了main函数中dir变量的内存值,具体触发点如下:

  • 你调用ruota函数时传入的参数P=1,在dir=1(左移)的分支中,mod计算逻辑为int mod=N-i%P;
  • 由于P=1,任何整数对1取模的结果都是0,因此mod最终等于N=6,而你定义的数组vet长度为maxN=6,合法下标范围仅为0~5,v[6]属于完全越界的非法地址
  • 栈上的局部变量是连续排布的,main函数中vet数组的内存空间刚好和后续定义的dir变量相邻,越界写入v[6]的操作直接写在了dir对应的内存地址上,就会出现dir被意外修改的现象。
修复建议
  1. 优先修正左移分支的下标计算逻辑,确保mod值落在0~N-1的合法范围内,同时补充case 1分支遗漏的break语句(原代码执行完左移逻辑后会继续穿透执行其他分支代码,也会引发逻辑异常),示例修正如下:
case 1: //rotazione a sinistra
{
    for(int i=N-P;i>=0;i--)
    { 
        // 调整mod计算逻辑,避免出现等于N的越界下标
        int mod=(N - (i % P) - 1) % N;
        int tmp=v[mod];
        v[mod]=v[i];
        v[i]=tmp;
    }
    break;
}
  1. 可以优化移位逻辑,不需要循环pos次每次移1位,直接在函数中支持一次性移位pos位,减少不必要的循环开销
  2. 编译代码时建议开启警告和栈保护选项,例如GCC编译时添加-Wall -fstack-protector参数,可以提前发现类似越界风险。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 00:36:03