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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 16:35:23