[C++] Debug 记录 Error:AddressSanitizer: SEGV on unknown address

The signal is caused by a READ memory access.

LeetCode报错:AddressSanitizer:DEADLYSIGNAL详细分析与解决_来知晓的博客-CSDN博客_addresssanitizer:deadlysignalhttps://blog.csdn.net/qq_17256689/article/details/118489525?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~Rate-1-118489525-blog-104148480.pc_relevant_3mothn_strategy_and_data_recovery&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~Rate-1-118489525-blog-104148480.pc_relevant_3mothn_strategy_and_data_recovery&utm_relevant_index=2

排查几点问题

  • (高频)越界,数组引用超越了左右边界
  • 无限递归,代码无法正常结束返回
  • (高频)函数入参及出参返回处理错误


排查可能问题一:越界,数组引用超越了左右边界

主要有两个思路:
1、先分配足够大的空间试试,看看是不是空间问题
2、在可能越界的地方提前打印下标值,看是否溢出。因为地址消毒是在运行时中断,可以用printf打印中止前的情况。

方法1:

在每处可能越界引用处,提前打印下标,记录程序崩溃前打印的下标系数
打印代码示例如下:
printf("index = %d\n", index);

方法2:

在数组分配空间初始化时,强行分配足够大的空间,确保空间足够
如果加大空间后,没有报错,则说明肯定是数组引用越界问题
运行代码后,发现下标打印是正常的,没有发现问题,于是继续排查可能问题二。

排查可能问题二:无限递归,代码无法正常结束返回

直接在递归函数backtrack的终止条件里打印输出记录
观察是否按预期的递归方式进行递归
如果没有任何打印记录,则说明函数没有终止,一直在无限递归
运行代码后,发现无该问题。

排查可能问题三:函数入参及出参返回处理错误
仔细阅读代码首行输入输出说明以及对比网上C代码实现后,发现输出参数理解有误。

变量二级指针returnColumnSizes保存的是每行输出的列数,虽然题目中的是固定列数,但需要赋值成相应的列数。而我最开始理解成了这个是二维数组的返回指针。
二维数组的返回指针是通过函数返回参数来传递的,直接return分配的二维数组首地址即可。


————————————————
版权声明:本文为CSDN博主「来知晓」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_17256689/article/details/118489525

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值