2016-05-17 2 views
0

Я новичок в C/C++. После долгих исследований мне нужна ваша помощь. Я просто хочу сохранить номер в unsigned char*, а затем вернуть номер обратно.int to unsigned char * и наоборот

int nu = 50; 
unsigned char byteArray[sizeof(int)]; 
memcpy(byteArray, &nu, sizeof(int)); 

int newNu = reinterpret_cast<int>(byteArray); 

Ожидается, что новый номер будет равен 50, вместо этого это не так. Может ли кто-нибудь показать мне, где я ошибаюсь?

Для int ->unsign char* Я думаю, что я был прав, но как изменить ход? это правильный путь? btw, я скомпилировал это на Visual Studio

+1

Если вы новичок в C++ не трогают массивы, указатели, тетср, и особенно reinterpret_cast с шестью футов полюсом. –

+1

Благодарю вас всех, я только начал изучать C/C++ в течение нескольких месяцев. Согласитесь, что беспорядок с управлением памятью - такая боль. Сейчас я сделаю шаг медленнее ... –

ответ

7

Ваш персонаж преобразует адрес массива в число.

Правильный способ, чтобы получить значение из вне:

int newNu; 
memcpy(&newNu, byteArray, sizeof newNu); 

Примечание: наивная попытка будет:

newNu = *reinterpret_cast<int *>(byteArray); 

однако это нарушает strict aliasing rule, а также потенциально являясь нарушением выравнивания , Не делай это. Предупреждение. Вы можете увидеть эту ошибку, повторенную в различных (не очень хороших) ссылках.

1

Не делайте этого !!!

Но в случае, если вы просто испытываете ...

Эта часть неправилен:

int newNu = reinterpret_cast<int>(byteArray); 

Вы бросаете адрес char массива int который, безусловно, не 50 ...

Это код, чтобы получить то, что вы ожидаете:

int newNu = *reinterpret_cast<int*>(byteArray); 

Также следует обратить внимание на порядок параметров в memcpy ... Это должно быть

memcpy(&newNu, byteArray, sizeof newNu);