我在想什么:
BYTE test[] = {0x00,0x00,0x00,0x00};
*(test+1) = 0xFFFF;
Run Code Online (Sandbox Code Playgroud)
我得到了什么:
00000000 11111111 00000000 00000000
Run Code Online (Sandbox Code Playgroud)
我期望或想要实现的目标:
00000000 11111111 11111111 00000000
Run Code Online (Sandbox Code Playgroud)
背景:在我的程序的一部分中,我需要将WORD插入到数组的一部分中.是的,通常我可以做
*(test+1) = 0xFF;
*(test+2) = 0xFF;
Run Code Online (Sandbox Code Playgroud)
但我想知道是否有可能像第一个例子中那样做一个单行.Memcpy在这里没有选择,因为我需要为第二个数组分配空间.
你的选择是
test[1] = 0xFF;
test[2] = 0xFF;
Run Code Online (Sandbox Code Playgroud)memset(test + 1, 0xFF, 2);
Run Code Online (Sandbox Code Playgroud)const char bytes[2] = {0xFF, 0xFF};
memcpy(test + 1, bytes, 2);
Run Code Online (Sandbox Code Playgroud)uint16_t value = 0xFFFF; // beware of byte order
memcpy(test + 1, &value, 2);
Run Code Online (Sandbox Code Playgroud)memcpy(test + 1, (const unsigned char []){0xFF, 0xFF}, 2));
Run Code Online (Sandbox Code Playgroud)或分别处理各个字节的任何其他代码.
什么不是一个选择是:
*(uint16_t)&test[1] = 0xFFFF;
Run Code Online (Sandbox Code Playgroud)
原因很简单:它在C中打破了两个规则:严格别名和对齐.更糟糕的是,你可以在这部分代码中侥幸逃脱,但解除引用未对齐的uint16_t指针永远不会安全,即使在x86-64上,据说支持未对齐的访问