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

C++一维数组模拟N维数组重载operator[]触发访问异常求助

问题根因

你的代码核心错误出在Int类构造函数的指针类型转换逻辑没有区分调用层级:

  • 仅第0层调用(Array::operator[]触发的第一次Int实例构造)时,传入的data_Int是Array::Address*类型,此时需要读取Address::data获取底层一维数组的首地址
  • 第1层及之后由Int::operator[]触发的构造,传入的data_Int已经是int*类型的偏移指针,你依然将其强制转换为Array::Address*去访问data成员,相当于把数组中存储的普通数值当做内存地址去解引用,直接触发访问违规。
修复方案

修改Int类的构造函数,根据层级判断指针类型后再做偏移计算:

Int(int index, int _level = -1, void* _data = NULL, Array* _array = NULL)
: level(_level), data_Int(_data), array(_array) {
    if (_level < 0 || index < 0 || index >= array->size[_level]) {
        data_Int = NULL;
        return;
    }
    int* base_ptr;
    if (level == 0) {
        // 第0层传入的是Address结构指针
        base_ptr = static_cast<Array::Address*>(data_Int)->data;
    } else {
        // 后续层级传入的已经是int数组的偏移指针
        base_ptr = static_cast<int*>(data_Int);
    }
    data_Int = static_cast<void*>(base_ptr + array->sum_size[level] * index);
}

同时补充了索引小于0的边界校验,避免负索引导致的越界问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 13:39:03