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

如何修复largeIntegers大整数类重载+运算符出现的段错误问题

问题原因

  • 核心触发段错误的问题:operator+重载函数返回了局部对象的引用。函数内定义的temp是栈上的局部变量,函数执行结束后对应的栈内存会被系统回收,返回的引用会变成悬垂引用,后续执行num3 = num1 + num2时访问已经被释放的非法内存,直接触发段错误。
  • 不符合题目要求的问题:你没有按照题目要求重载赋值运算符operator=,当前使用编译器默认生成的浅拷贝逻辑,虽然类内的固定大小栈数组暂时不会触发问题,但如果后续调整为动态存储结构会直接出错,也不符合题目设计要求。
  • 功能不完善问题:当前加法逻辑仅支持两个正整数相加,没有处理符号判断,无法支持负数运算,但该问题不会触发段错误。

修复方案

1. 修改加法运算符的返回值类型

将operator+的返回值从引用类型改为值类型,直接返回局部对象即可,不要返回引用:

// 类内声明修改为
largeIntegers operator+(largeIntegers &);
// 类外实现修改为
largeIntegers largeIntegers::operator+(largeIntegers &integer) {
  largeIntegers temp;
  temp.isPositive = isPositive;
  int remainder = 0;
  int digi = max(digits, integer.digits);
  temp.digits = digi;
  for (int i = 0; i < digi; i++) {
    temp.num[i] = (remainder + num[i] + integer.num[i]) % 10;
    remainder = (remainder + num[i] + integer.num[i]) / 10;
  }
  // 增加边界判断,防止超过100位数组越界
  if (remainder && digi < 100) {
    temp.num[digi] = remainder;
    temp.digits++;
  }
  return temp;
}

2. 补充重载赋值运算符

按照题目要求实现深拷贝赋值逻辑:

// 类内添加声明
largeIntegers& operator=(const largeIntegers &);
// 类外实现
largeIntegers& largeIntegers::operator=(const largeIntegers &other) {
  if (this == &other) return *this;
  digits = other.digits;
  isPositive = other.isPositive;
  memset(num, 0, sizeof(num));
  for (int i = 0; i < digits; i++) {
    num[i] = other.num[i];
  }
  return *this;
}

可选功能补充

如果需要支持正负整数的加减运算,只需要在operator+和后续实现的operator-中先判断两个操作数的符号,转换为对应的加法或绝对值减法逻辑,再设置结果的符号即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 04:36:07