2011-03-09 73 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