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

C++自定义Array类按索引填充数组时输出全为0的问题排查

问题核心原因

  • 主函数中创建对象时调用的是单参数构造函数MyArray(int size),这个函数仅申请了对应大小的堆内存,没有对数组元素做任何赋值操作,输出的0是未初始化内存的随机值,只是你当前运行环境下刚好返回0而已。
  • 你写了按索引赋值逻辑的是双参数构造函数MyArray(int size, double def_val),代码全程没有调用这个构造函数,自然不会触发对应的赋值逻辑。

其他存在的隐患

  • 拷贝构造函数存在严重野指针问题:你没有为当前对象的a指针申请内存,直接对a[i]赋值会访问非法内存,运行大概率崩溃。
  • 双参数构造函数的入参def_val没有被使用,不符合作业要求的「指定数组大小并为所有元素赋默认值」的需求,可以保留这个构造函数的默认值赋值逻辑,再额外加一个按索引赋值的构造函数,或者根据你的实际需求调整。

修改方案

1. 快速验证按索引填充逻辑

如果仅需要验证你写的双参数构造函数的赋值逻辑,直接修改main函数的对象创建代码即可:
把MyArray a(5);改成MyArray a(5, 0);(第二个参数可随便传值,你当前的双参数构造函数实现没有用到这个入参),运行后就能得到0 1 2 3 4的预期输出。

2. 修复拷贝构造函数

MyArray::MyArray(const MyArray & a2) {
    n = a2.n;
    a = new double[n]; // 必须先为当前对象的数组申请内存
    for (int i = 0; i < n; i++) {
        a[i] = a2.a[i];
    }
}

3. 对齐作业要求的方案

如果需要同时满足「单参数指定大小」「双参数按默认值填充所有元素」「按索引填充」三个需求,可以调整构造函数实现:

首先修改双参数构造函数,实现按默认值填充的需求:

MyArray::MyArray(int size, double def_val) {
    n = size;
    a = new double[size];
    for (int i = 0; i < size; ++i) {
        a[i] = def_val;
    }
}

再修改单参数构造函数,默认按索引填充:

MyArray::MyArray(int size) {
    n = size;
    a = new double[size];
    for (int i = 0; i < size; ++i) {
        a[i] = i;
    }
}

修改后你原来的main函数无需改动,运行直接输出0 1 2 3 4的预期结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 19:57:05