c - 如何修改数组中超过 1 个字节?

标签 c

我正在尝试:

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

最佳答案

你的选择是

  1. test[1] = 0xFF;
    test[2] = 0xFF;
    
  2. memset(test + 1, 0xFF, 2);
    
  3. const char bytes[2] = {0xFF, 0xFF};
    memcpy(test + 1, bytes, 2);
    
  4. uint16_t value = 0xFFFF;     // beware of byte order
    memcpy(test + 1, &value, 2);
    
  5. memcpy(test + 1, (const unsigned char []){0xFF, 0xFF}, 2));
    
  6. 或任何其他单独寻址各个字节的代码。


不是的选项是:

*(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/

相关文章:

c - 如何在 Visual Studio 2005 上检测未引用的 C/C++ 代码?

c - 下面是我的代码,以参数 n 表示的函数返回是什么?

c++ - icc 不执行循环不变代码运动

c - 重复使用相同的线程

c - 变量已在 a.obj 中定义

c - 在 C 中为 unsigned long long 赋值

c - 在运行时扫描共享对象包含

c - 是一个指针;您的意思是使用 ‘->’ 吗?

c - 对文件内容使用 atoi() 时出现意外结果,按字符读取字符

在 C 中使用 EOF 的条件