为何修改数组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:
int arrOne[inputOne.length()]; int arrTwo[inputTwo.length()]; - 使用标准容器(推荐):C++标准并不支持变长数组(用变量定义数组长度是部分编译器的扩展特性),更规范的写法是用
std::vector动态创建数组:#include <vector> // 需要额外包含头文件 // ... vector<int> arrOne(inputOne.length()); vector<int> arrTwo(inputTwo.length());
内容的提问来源于stack exchange,提问作者Austin Wolff
相关产品推荐
相关产品推荐

