以前不注意分别&与&&,因为&少一个字符,所以本着能偷懒就偷懒的原则,一直把&当做逻辑运算与使用。
今天遇到一个内存访问错误,定位到是由下面的代码引发的:
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。这样,只有当第一个条件满足时,第二个条件才会被计算。这可以避免访问未定义的内存地址,从而避免运行时错误。
所以用逻辑与的时候还是老老实实用&&,少点儿偷懒!