由&引发的内存错误

以前不注意分别&与&&,因为&少一个字符,所以本着能偷懒就偷懒的原则,一直把&当做逻辑运算与使用。

今天遇到一个内存访问错误,定位到是由下面的代码引发的:

for(int i = 0; i <= m -1 & obstacleGrid[i][0] == 0; i++)  dp[i][0] = 1;

LeetCode报错如下:

Line 1034: Char 9: runtime error: reference binding to misaligned address 0xbebebebebebebebe for type 'int', which requires 4 byte alignment (stl_vector.h) 0xbebebebebebebebe: note: pointer points here <memory cannot be printed> SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior /usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/stl_vector.h:1043:9

后来经过琢磨,原来是由于&&和&在充当时的区别引起的,具体是这样的:

'&'是按位与运算符,用于对两个整数进行位运算,将它们的二进制位逐位进行AND操作。这样的结果是,即使第一个条件不满足,第二个条件也会被计算。这导致了错误,因为此时数组下标已经越界,相当于obstacleGrid[i][0]意图访问一个未定义的内存地址。

而'&&'是逻辑与运算符,只有在两个条件都为true时才返回true。这样,只有当第一个条件满足时,第二个条件才会被计算。这可以避免访问未定义的内存地址,从而避免运行时错误。

所以用逻辑与的时候还是老老实实用&&,少点儿偷懒!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值