2016-07-24 51 views
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。这是为什么?

回答

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; 
} 
+0

谢谢!我知道这是我失踪的根本。这完全有道理。 –

1

表达&test2+1是通过测试的大小缩放,所以你设置下面的unsigned shorttest2在内存中,而不是test2最高字节。由于您正在引用的unsigned short未分配,因此您正在调用未定义的行为

你将不得不投&test2char *拿到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 */ 
相关问题