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

C++未被修改的变量n在for循环后值异常变化问题求助

问题根因
  • 你使用了非标准C的变长数组(VLA)特性:int arr[n]; 这种用变量定义数组长度的语法不属于C标准规定的内容,是部分编译器提供的扩展,行为没有标准保障,本身不推荐在C++代码中使用。
  • 数组声明顺序错误:你在尚未给n读取赋值的前提下就声明了arr,此时n是未初始化的垃圾值,数组实际开辟的空间长度就是这个垃圾值,你的运行环境中当时这个垃圾值刚好为2,也就是说arr实际只有2个int类型的存储空间。
  • 数组越界写入触发栈内存踩踏:后续你将n赋值为4,for循环要往arr中写入4个元素,明显超出了数组实际的2个元素的空间,越界的写入操作刚好覆盖了栈上和arr相邻存储的n变量的内存,且你输入的第三个元素值刚好为2,所以n的值被意外修改为2,和你观察到的现象完全吻合。
修复方案

方案1(仅调整顺序,不推荐)

如果坚持使用编译器扩展的变长数组,只需要把数组声明的顺序挪到读取n之后,保证声明数组时n已经是有效值即可:

int n;
cin >> n;
int arr[n]; // 此时n已经被赋值为4,数组实际长度为4

方案2(标准C++写法,推荐)

使用标准库的std::vector代替变长数组,完全规避这类内存问题,同时符合C++语法规范,完整可运行代码如下:

#include <iostream>
#include <vector>
using namespace std;

int main() {
    int n;
    cin >> n;
    vector<int> arr(n);
    
    cout << n << "\n";
    
    for(int i = 0; i < n; i++){
        cin >> arr[i];
    }
    
    cout << n << "\n";
    
    for(int i = n - 1; i >= 0; i--){
        cout << arr[i] << " ";
    }
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 16:39:02