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

为何修改数组arrTwo时,数组arrOne会被意外修改?

数组越界导致的意外修改问题

当输入"12345"和"0"时,第一个循环中arrOne被正确填充为1、2、3、4、5。但在第二个循环填充arrTwo后,第三个循环打印arrOne时,其值变为0、2、3、4、5。困惑于arrOne的初始值为何在初始循环后被修改,恳请指导!

问题代码

#include <iostream>
#include <string>
#include <iomanip>

using namespace std;

int main()
{
    // Write your main here
    string inputOne = "";
    string inputTwo = "";


    cout << "Please enter two positive integers up to 20 digits long" << endl;
    cin >> inputOne;
    cin >> inputTwo;

    int arrOne[inputOne.length() - 1];
    int arrTwo[inputTwo.length() - 1];

    for(int i = 0; i< inputOne.length(); i++){
        arrOne[i] = inputOne[i] - '0';
        cout<< "arrOne[i] = " << arrOne[i] << endl;
    }

    for(int i = 0; i< inputTwo.length(); i++){
        arrTwo[i] = inputTwo[i] - '0';
        cout<< "arrTwo[i] = " << arrTwo[i] << endl;
    }

    for(int i = 0; i< inputOne.length(); i++){
        cout<< "arrOne[i] = " << arrOne[i] << endl;
    }

    return 0;
}

问题原因

核心是数组越界访问导致栈内存被意外覆盖:

  • 输入"12345"时,inputOne.length()是5,但你创建的arrOne长度是5-1=4,数组有效下标范围是0到3。但第一个循环遍历了5次(i<5),给arrOne[4]赋值时已经越界,破坏了栈上的相邻内存区域。
  • 输入"0"时,inputTwo.length()是1,创建的arrTwo长度是1-1=0,第二个循环遍历1次(i<1),给arrTwo[0]赋值时同样越界。
  • 栈内存中的变量是连续存储的,两次越界操作刚好覆盖了arrOne[0]所在的内存,所以最终arrOne[0]被修改为0。

解决方案

  1. 修正数组长度:数组长度应等于输入字符串的长度,而非长度减1:
    int arrOne[inputOne.length()];
    int arrTwo[inputTwo.length()];
    
  2. 使用标准容器(推荐):C++标准并不支持变长数组(用变量定义数组长度是部分编译器的扩展特性),更规范的写法是用std::vector动态创建数组:
    #include <vector> // 需要额外包含头文件
    
    // ...
    
    vector<int> arrOne(inputOne.length());
    vector<int> arrTwo(inputTwo.length());
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 09:00:07