如何在数组中修改多个字节?

Knt*_*lii 2 c

我在想什么:

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在这里没有选择,因为我需要为第二个数组分配空间.

Alo*_*hal 5

对于这种情况,memset(test+1, 0xFF, 2)应该工作.


Ant*_*ala 5

你的选择是

  1. test[1] = 0xFF;
    test[2] = 0xFF;
    
    Run Code Online (Sandbox Code Playgroud)
  2. memset(test + 1, 0xFF, 2);
    
    Run Code Online (Sandbox Code Playgroud)
  3. const char bytes[2] = {0xFF, 0xFF};
    memcpy(test + 1, bytes, 2);
    
    Run Code Online (Sandbox Code Playgroud)
  4. uint16_t value = 0xFFFF;     // beware of byte order
    memcpy(test + 1, &value, 2);
    
    Run Code Online (Sandbox Code Playgroud)
  5. memcpy(test + 1, (const unsigned char []){0xFF, 0xFF}, 2));
    
    Run Code Online (Sandbox Code Playgroud)
  6. 或分别处理各个字节的任何其他代码.


什么不是一个选择是:

*(uint16_t)&test[1] = 0xFFFF;
Run Code Online (Sandbox Code Playgroud)

原因很简单:它在C中打破了两个规则:严格别名对齐.更糟糕的是,你可以部分代码中侥幸逃脱,但解除引用未对齐的uint16_t指针永远不会安全,即使在x86-64上,据说支持未对齐的访问