2016-05-17 42 views
0

我是C/C++的新手。经过长时间的研究,我需要你的帮助。我只想在unsigned char*中存储一个号码,然后将号码重新输入。int为无符号字符*反之亦然

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

int newNu = reinterpret_cast<int>(byteArray); 

我期待newNu将是50,而不是。任何人都可以告诉我我错在哪里?

对于int - >unsign char*我认为我是正确的,但如何扭转进展?这是正确的方式吗?顺便说一句,我编译这Visual Studio

+1

如果你是新的C++不碰数组,指针,memcpy的,特别是与六只脚杆的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); 
相关问题