Приведите int как байтовый массив в C ++ - PullRequest
4 голосов
/ 09 марта 2011

Я пытаюсь использовать метод поиска LSB, предложенный Эндрю Грантом в ответе на этот вопрос: Позиция младшего значащего бита, который установлен

Однако это приводит к ошибке сегментации. Вот небольшая программа, демонстрирующая проблему:

#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-Style в C ++ не является хорошей практикой. Должен ли я использовать reinterpret_cast<Byte*>(value) вместо этого? Это по-прежнему приводит к ошибке сегментации.

Ответы [ 5 ]

11 голосов
/ 09 марта 2011

Используйте это:

(Byte*) &value;

Вы не хотите указатель на адрес 300, вы хотите указатель, где хранится 300.Таким образом, вы используете адрес оператора &, чтобы получить адрес value.

7 голосов
/ 09 марта 2011

В то время как Эрик ответил на ваш общий вопрос, в качестве продолжения я бы сказал категорически - да, следует использовать reinterpret_cast вместо броска в стиле C.

Byte* byteArray = reinterpret_cast<Byte*>(&value);
1 голос
/ 09 марта 2011

Строка должна быть: Byte * byteArray = (Byte *) & value;

Вам не нужно ставить (void *) перед ним.

-Chert

0 голосов
/ 09 марта 2011

@ Эрик уже исправил вашу основную проблему, но есть небольшая, которая у вас все еще есть.Если вы ищете только наименее значимый бит , вам не нужно беспокоиться о приведении.

int main()
{
    int value = 300;       
    if (value & 0x00000001)       
    {           
        std::cout<< "LSB is set" << std::endl;
    }
    return 0;
}
0 голосов
/ 09 марта 2011
char *array=(char*)(void*)&value;

Обычно вы берете указатель на начало строки и преобразуете его в указатель на байт.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...