我正在尝试使用memset
单独设置无符号短变量中的字节:
#include <cstring>
#include <iostream>
int main()
{
unsigned short test2; // 2 bytes
std::cout << "size of test2: " << sizeof(test2) << std::endl;
memset(&test2, 0, 2);
memset(&test2, 0x4D, 1);
memset(&test2+1, 0x42, 1);
std::cout << "value: " << test2 << std::endl;
return 0;
}
我得到的输出是:
size of test2: 2
value: 77
77是0x4D。所以由于某种原因,它没有拿起我试图在变量的第二个字节上设置的0x42。那是为什么?
答案 0 :(得分:6)
&test2+1
实际上会将地址推进sizeof(test2)
,即2,并将指针移到超出范围。
尝试使用转换为char*
:
#include <cstring>
#include <iostream>
int main()
{
unsigned short test2; // 2 bytes
std::cout << "size of test2: " << sizeof(test2) << std::endl;
memset(&test2, 0, 2);
memset(&test2, 0x4D, 1);
memset((char*)&test2+1, 0x42, 1);
std::cout << "value: " << test2 << std::endl;
return 0;
}
答案 1 :(得分:1)
表达式&test2+1
按照测试的大小进行缩放,因此您要在内存中设置unsigned short
之后的test2
,而不是test2
的顶部字节。由于未引用此引用的unsigned short
,因此您正在调用未定义的行为。
您必须将&test2
转换为char *
以获得1(字节)的缩放:
memset((char *)&test + 1, 0x42, 1);
在不使用memset()
的情况下执行此操作的另一种方法:
unsigned short setbytes(unsigned char hi, unsigned char lo)
{
return hi << 8 | lo;
}
...
unsigned short test2 = setbytes(0x42, 0x4D); /* --> 0x424D */