自定义大整数类MyInt两实例相乘触发数组越界问题排查
MyInt类两个实例相乘数组越界的常见原因
- 结果存储空间分配不足
位数为m和n的两个大整数相乘,乘积的最大位数为m+n,如果你初始化结果对象的内部数组时只申请了m+n-1或者更小的长度,写入最高位的进位时就会直接触发越界。优先检查乘法函数中结果实例的长度初始化逻辑,确认是否预留了足够的空间。 - 循环下标边界错误
逐位相乘的常规逻辑是res[i+j] += num1[i] * num2[j],如果循环的终止条件错误(比如误用了MyInt和int相乘时的循环边界),或者处理进位时下标超出了结果数组的最大索引,都会触发越界访问。 - 临时运算溢出导致下标异常
如果存储单段数值的变量类型选择过小(比如用char存储1位数字,要是存多位数块就很容易溢出),溢出后产生的异常值如果被用来计算数组下标,就会出现非法的下标访问。建议逐位/逐块相乘的临时结果用int甚至long long类型存储。 - 运算符重载逻辑错误
如果你重载的operator*没有正确处理参数(比如没有用const引用传参导致实例内部数据被意外修改),或者构造返回值时错误复用了当前对象的长度而非两个乘数的长度和,也会间接导致内部数组越界。
内容的提问来源于stack exchange,提问作者Andrew Kennedy
相关产品推荐
相关产品推荐

