2016-07-24 53 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 */ 
相關問題