2012-07-09 2 views
2

2 ints, 2 shorts 및 1 char 씩 차례로 복사하고 싶습니다.C++ memcpy 오류

이것은 내가 무슨 짓을 :

int32_t a=1; 
int32_t b=2; 
int16_t c=3; 
int16_t d=4; 
int8_t e=5; 
char*buf=new char[104]; 
memcpy(buf, &a, 32); 
memcpy(buf + 32, &b, 32); 
memcpy(buf + 64, &c, 16); 
memcpy(buf + 80, &d, 16); 
memcpy(buf + 96, &e, 8); 

이 맞습니까? 내 디버거는 세 번째 줄이 두 번째에 영향을 미친다고하지만, 아마도 디버거를 오용하고 있다고 말합니다 (더 구체적으로 말하면 * ((int32_t *) (buf + 32)의 값은 두 번째와 세 번째 memcpy 사이에서 변경됩니다) .

감사합니다.

+4

'sizeof'와'offsetof' 매크로를 사용하십시오. – Ben

답변

7

비트와 바이트가 서로 섞여서 많은 부분의 메모리를 덮어 쓰고 덮어 쓰고 있습니다!

int32_t x; /* 4 bytes, 32 bits */ 
int16_t y; /* 2 bytes, 16 bits */ 

memcpy(buf   , &x, sizeof(x)); /* copy 4 BYTES, or sizeof(x) */ 
memcpy(buf + sizeof(x), &y, sizeof(y)); /* copy 2 bytes */ 

그래서, 당신의 버퍼은 필요 이상으로 약 8 배이며, 모든 시간을 필요에 따라 4 배 많은 데이터를 복사하고 있습니다.

+2

오 memcpy는 바이트가 아닌 바이트로 계산됩니다. – Kaleyc

+0

변수 이름이 여섯 글자가 아니기 때문에 downvote로 유혹을받습니다.) – sbk

+0

수정했습니다. 나는 여전히 컴파일러가 * ((uint16_t *) (buf + 8))가 c와 같지 않다는 것을 왜 이해하지 못한다. – Kaleyc

2

memcpy 크기는 바이트가 아니라 바이트로 측정됩니다. 그것은이어야합니다 :

memcpy(buf, &a, 4); 
memcpy(buf + 4, &b, 4); 
memcpy(buf + 8, &c, 2); 
memcpy(buf + 10, &d, 2); 
memcpy(buf + 12, &e, 1);