我正在尝试:
BYTE test[] = {0x00,0x00,0x00,0x00};
*(test+1) = 0xFFFF;
我得到的:
00000000 11111111 00000000 00000000
我期望或想要实现的目标:
00000000 11111111 11111111 00000000
背景: 在我的程序的一部分中,我需要将一个 WORD 插入数组的一部分。 是的,通常我可以这样做
*(test+1) = 0xFF;
*(test+2) = 0xFF;
但我想知道是否有可能像第一个示例那样将其作为单行代码来执行此操作。 Memcpy 在这里没有选择,因为我需要为第二个数组分配空间。
最佳答案
你的选择是
-
test[1] = 0xFF; test[2] = 0xFF;
-
memset(test + 1, 0xFF, 2);
-
const char bytes[2] = {0xFF, 0xFF}; memcpy(test + 1, bytes, 2);
-
uint16_t value = 0xFFFF; // beware of byte order memcpy(test + 1, &value, 2);
-
memcpy(test + 1, (const unsigned char []){0xFF, 0xFF}, 2));
或任何其他单独寻址各个字节的代码。
不是的选项是:
*(uint16_t)&test[1] = 0xFFFF;
原因很简单:它打破了 C 中的两条规则:严格的别名 和 对齐。更糟糕的是,您可以在这部分代码中解决这个问题,但是dereferencing unaligned uint16_t
pointers is never safe, even on x86-64 that supposedly supports unaligned accesses
关于c - 如何修改数组中超过 1 个字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54814993/