2012-09-21 67 views
3

位圖排序程序,其中,所述分配部分是:c輸入,如果塊時條件爲假一個

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;
這最後導致segmentfault,我只是不明白,根據該情況會成爲現實

例如:
這樣當GDB狀態:
J = 44,I = 6250,ARR [I] = 4096和print (arr[i] & (1 << j))給出0
但程序仍進入塊

+0

你能解釋一下p點嗎? – MarsRover

+0

你的數組'arr []'的數據類型是什麼? 'int64_t'? –

+0

一。你正在使用'&',你可能不應該這樣做。二。我假設'j'是一個'int' - 也就是說,它只有64位長。由於它是一個int類型,所以'1'字面值也會被視爲一個int值,它會溢出(通常在第31位之後)。 – 2012-09-21 11:44:45

回答

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)。

+0

...假設「長」也是64位。 –

+0

@Charles:對不起,是的,我假設LP64--現在從「L」變成了「LL」。 –

+0

感謝您的幫助,原諒noob ..:< – Nowhy

3

1 << j不是很明確的,如果它是intj大於或等於CHAR_BIT * sizeof (int)。這可能是一個問題,因爲您在示例中使用了j = 44

相關問題