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
相关产品推荐
相关产品推荐

