将字节设置为无符号短整型

4

我正在尝试使用 memset 单独设置无符号短整型变量中的字节:

#include <cstring>
#include <iostream>

int main()
{
  unsigned short test2; // 2 bytes

  std::cout << "size of test2: " << sizeof(test2) << std::endl;

  memset(&test2, 0, 2); 
  memset(&test2, 0x4D, 1);                                                               
  memset(&test2+1, 0x42, 1); 

  std::cout << "value: " << test2 << std::endl;

  return 0;
}

我所得到的输出为:
size of test2: 2
value: 77

77 是 0x4D。所以出于某种原因,它没有捕捉到我试图设置在变量的第二个字节上的 0x42。为什么会这样呢?

2个回答

6

&test2+1 实际上会将地址增加 sizeof(test2),也就是 2,并将指针移动到超出范围的位置。

尝试使用强制类型转换为 char*

#include <cstring>
#include <iostream>

int main()
{
  unsigned short test2; // 2 bytes

  std::cout << "size of test2: " << sizeof(test2) << std::endl;

  memset(&test2, 0, 2); 
  memset(&test2, 0x4D, 1);                                                               
  memset((char*)&test2+1, 0x42, 1); 

  std::cout << "value: " << test2 << std::endl;

  return 0;
}

谢谢!我知道我漏掉了一些基本的东西。那完全有道理。 - Bogu Wei

1
表达式&test2+1根据test的大小进行缩放,因此您正在设置存储在test2后面的unsigned short,而不是test2的顶部字节。由于您引用的这个unsigned short没有被分配,因此会引发未定义行为
您需要将&test2转换为char *以获得1(字节)的缩放:
memset((char *)&test + 1, 0x42, 1);

另一种不使用memset()的方法是:
unsigned short setbytes(unsigned char hi, unsigned char lo)
{
    return hi << 8 | lo;
}

...    

    unsigned short test2 = setbytes(0x42, 0x4D); /* --> 0x424D */

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接