C++数组输入异常:输入数据同时存入两个数组的问题排查
问题分析与解决方案
你遇到的问题核心是数组越界导致的未定义行为,具体原因和修复方案如下:
问题代码
int M[0], N[0]; std::cin >> m >> n; for (int i = 0; i < m; ++i) { std::cin >> M[i]; } for(int i=0; i<m; i++) { std::cout << M[i]; } std::cout << "\n"; for(int i=0; i<n; i++) { std::cout << N[i]; }
原因解析
- 你定义的
int M[0], N[0];是长度为0的数组,这在C++标准中属于未定义行为(部分编译器允许但行为完全不可控),这类数组不会分配任何有效存储空间。 - 当你通过
M[i]写入数据时,本质是在访问数组边界外的内存,也就是越界访问。由于M和N在栈内存中通常是连续存放的,你往M的“越界位置”写入的数据,刚好覆盖到了N所在的内存区域,所以输出N时会看到M的数据。
修复方案
不要使用长度为0的数组,改用动态分配的容器或数组:
方案1:使用std::vector(推荐,安全且无需手动管理内存)
#include <iostream> #include <vector> int main() { int m, n; std::cin >> m >> n; // 根据m的大小初始化vector std::vector<int> M(m); for (int i = 0; i < m; ++i) { std::cin >> M[i]; } // 输出M for (int num : M) { std::cout << num; } std::cout << "\n"; // 根据n的大小初始化vector std::vector<int> N(n); // 如果需要输入N的数据,取消下面注释 // for (int i = 0; i < n; ++i) { // std::cin >> N[i]; // } // 输出N for (int num : N) { std::cout << num; } return 0; }
方案2:使用动态分配数组(需手动释放内存)
#include <iostream> int main() { int m, n; std::cin >> m >> n; // 动态分配m个int的内存 int* M = new int[m]; for (int i = 0; i < m; ++i) { std::cin >> M[i]; } // 输出M for (int i = 0; i < m; ++i) { std::cout << M[i]; } std::cout << "\n"; // 动态分配n个int的内存 int* N = new int[n]; // 如果需要输入N的数据,取消下面注释 // for (int i = 0; i < n; ++i) { // std::cin >> N[i]; // } // 输出N for (int i = 0; i < n; ++i) { std::cout << N[i]; } // 手动释放内存,避免泄漏 delete[] M; delete[] N; return 0; }
内容的提问来源于stack exchange,提问作者Molly Dempsey
相关产品推荐
相关产品推荐

