3

一个位图排序程序,其中assign部分为:

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,程序还是进入block执行语句:
*p++ = j + 64 *i;
最后导致segmentfault,就是不明白什么情况下会发生

示例:
当 gdb 状态如下时:
j=44, i=6250, arr[i]=4096 并print (arr[i] & (1 << j))给出 0
但程序仍进入块

4

2 回答 2

4

我的猜测是你有 32 位整数,但你的数组数据类型是int64_t. 在这种情况下,您需要更改:

    if(0 != (arr[i] & (1 << j))){

到:

    if(0 != (arr[i] & (1LL << j))){

因为1 << j是未定义的j >= sizeof(int) * CHAR_BIT(即j >= 32在你的情况下)。

于 2012-09-21T11:45:13.230 回答
3

1 << jint如果和j大于或等于 ,则不是很明确CHAR_BIT * sizeof (int)j = 44由于您在示例中使用,这可能是一个问题。

于 2012-09-21T11:44:41.187 回答