3

割り当て部分が次のビットマップソートプログラム:

for(i = MAX/64-1;i >= 0;i--){
    for(j = 0;j < 64;j++){
        if(0 != (arr[i] & (1 << j))){
            *p++ = j + 64 * i;  
        }   
    }   
}

if条件が0を返し、プログラムがまだブロックに入り、ステートメントを実行する場合があります。
*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))){

since1 << jは未定義ですj >= sizeof(int) * CHAR_BIT(つまりj >= 32、あなたの場合)。

于 2012-09-21T11:45:13.230 に答える
3

1 << jであり、以上である場合int、はあまり明確に定義されていません。例で使用しているため、これは問題になる可能性があります。jCHAR_BIT * sizeof (int)j = 44

于 2012-09-21T11:44:41.187 に答える