2012-07-09 49 views
2

我想複製2個整數,2個短褲和1個字符一個接一個。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 2012-07-09 13:35:43

回答

7

你已經混合了比特和字節,並且正在overreading並覆蓋大部分內存!

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 2012-07-09 13:37:11

+0

我只是因爲你的變量名不是六個字母而被動詞downvote;) – sbk 2012-07-09 13:42:01

+0

我改正了它。我仍然不明白編譯器爲什麼說*((uint16_t *)(buf + 8))不等於c。 – Kaleyc 2012-07-09 13:50:54

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);