2011-03-09 72 views
4

我試圖使用實現在回答這個問題的安德建議的LSB查找方法:Position of least significant bit that is set演員INT在C字節數組++

然而,它導致分段錯誤。這是一個小程序,演示問題:

#include <iostream> 

typedef unsigned char Byte; 

int main() 
{ 
    int value = 300; 
    Byte* byteArray = (Byte*)value; 
    if (byteArray[0] > 0) 
    { 
     std::cout<< "This line is never reached. Trying to access the array index results in a seg-fault." << std::endl; 
    } 
    return 0; 
} 

我在做什麼錯?
我讀過,在C++中使用'C-Style'強制轉換不是很好的做法。我應該用reinterpret_cast<Byte*>(value)代替嗎?不過,這仍然會導致分段錯誤。

回答

10

使用此:

(Byte*) &value; 

你不想一個指針,以解決300,你想在什麼地方300存儲。因此,您使用運營商地址&來獲取地址value

+0

啊,成功了。謝謝。 – 2011-03-09 18:48:25

+0

修復了他的指針問題,但對於給定的問題,演員仍然是不必要的。 – 2011-03-09 19:09:21

0
char *array=(char*)(void*)&value; 

基本上你將一個指針指向字符串的開頭,並將其重新指向一個指向字節的指針。

1

行應該是: BYTE *的ByteArray =(BYTE *)&value;

你不應該把(無效*)在它的前面。

-Chert

5

雖然埃裏克回答了你的整個問題,爲後續我會強調說 - 是的,reinterpret_cast應使用,而不是C風格的轉換。

Byte* byteArray = reinterpret_cast<Byte*>(&value); 
0

@Erik已經解決了您的主要問題,但您仍然有一個微妙的問題。如果你只是尋找最不重要的,根本不需要打擾演員。

int main() 
{ 
    int value = 300;  
    if (value & 0x00000001)  
    {   
     std::cout<< "LSB is set" << std::endl; 
    } 
    return 0; 
} 
+0

他正在尋找*位置*的最低有效*集*位。顯然,這仍然可以在沒有任何字節數組的情況下找到。 – Erik 2011-03-09 19:15:25

+0

在這種情況下,他的實施是完全錯誤的。他現在只會檢查最低字節是否等於1. – 2011-03-09 19:17:22

+0

是的,但正如他所述,代碼是一個特定問題的演示。我的回答解決了特定的問題。如果這是他的真實代碼,那麼它需要一些工作:P – Erik 2011-03-09 19:23:55