位图排序程序,其中赋值部分为:
for(i = MAX/64-1;i >= 0;i--){
for(j = 0;j < 64;j++){
if(0 != (arr[i] & (1 << j))){
*p++ = j + 64 * i;
}
}
}
我gdb它,有时当if条件返回0并且程序仍然进入块并执行语句时:
*p++ = j + 64 *i;
这最终导致段故障,我只是不明白它会在哪种情况下发生
例如:
当gdb状态如下:
j = 44,i = 6250,arr [i] = 4096,print (arr[i] & (1 << j))
给出0
但程序仍然进入块
答案 0 :(得分:4)
我的猜测是你有32位整数,但你的数组数据类型是int64_t
。在这种情况下,您需要更改:
if(0 != (arr[i] & (1 << j))){
为:
if(0 != (arr[i] & (1LL << j))){
由于1 << j
j >= sizeof(int) * CHAR_BIT
未定义{(1}}(例如j >= 32
)。
答案 1 :(得分:3)
1 << j
如果int
且j
大于或等于CHAR_BIT * sizeof (int)
,则定义不明确。这可能是一个问题,因为您在示例中使用了j = 44
。