2016-07-24 3 views
4

내가 부호없는 짧은 변수에 바이트를 설정하기 위해 노력하고있어 :바이트 설정 부호 개별적으로 <code>memset</code> 사용하여 짧은

#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 실제로 주소를 2로 설정하고 sizeof(test2)으로 진행하고 포인터를 범위를 벗어납니다.

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 참조가 할당되어 있지 않으므로 정의되지 않은 동작을 호출합니다.

당신은 1 (바이트)의 스케일링을 얻을 수 char *-&test2 캐스팅해야합니다 :

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