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

时间:2019-02-21 19:41:13

标签: c

我正在尝试:

.carousel-item,.active{
    height:100vh;
    width:100%;
    overflow:hidden;
    margin:0;
    padding:0;
    -webkit-transition: 0.6s ease-in-out left;
    transition: 0.6s ease-in-out left;
}

我得到的是

BYTE test[] = {0x00,0x00,0x00,0x00};
*(test+1) = 0xFFFF;

我期望或想要实现的目标:

00000000 11111111 00000000 00000000

背景: 在程序的一部分中,我需要将WORD插入数组的一部分。 是的,通常我可以做

00000000 11111111 11111111 00000000

但是我想知道是否有可能像第一个示例那样以单线方式执行此操作。 Memcpy在这里是没有选择的,因为我需要为第二个数组分配空间。

4 个答案:

答案 0 :(得分:5)

在这种情况下,memset(test+1, 0xFF, 2)应该可以工作。

答案 1 :(得分:5)

您的选择是

  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语言中的两个规则:严格别名对齐。更糟糕的是,您可以在代码的 this 部分中摆脱它,但是dereferencing unaligned uint16_t pointers is never safe, even on x86-64 that supposedly supports unaligned accesses

答案 2 :(得分:-1)

#define modify(dest,src,pos)    do { unsigned char *tmp =(void *)&dest; memcpy(tmp + pos,&src, sizeof(src));}while(0)

void *modify1(void *dest, void *src, size_t pos, size_t len)
{
    unsigned char *tmp = dest;
    memcpy(tmp + pos, src, len);
    return tmp + pos;
}

示例:

char x[10];
short y = 0xffff;
modify(x,y,3);

or modify1(x,&y, 3, sizeof(y));

请注意,宏一并不能在所有情况下都起作用。

答案 3 :(得分:-2)

以下代码是通用解决方案,可让您将2字节(16位)的值写入数组的连续单元:

uint16 data = 0xFFFF;

BYTE test[] = {0x00,0x00,0x00,0x00};
*(test+1) = data & 0xFF;
*(test+2) = data >> 8;

结果将是:

00000000 11111111 11111111 00000000

因此只需更改data的值即可。