|
查看: 1241|回复: 5
|
memcpy 的问题
[复制链接]
|
|
|
我遇到了一些memcpy的问题,想请各位高手帮忙
这是我的code
#include "stdafx.h"
#include <string.h>
#include <windows.h>
int main()
{
BYTE* a = new BYTE[12];
DWORD b = 0x28;
DWORD c = 4;
memset(a, '0', 24);
printf("%s\n",a); //Expect to be 0
memcpy(a+2, &b, sizeof(WORD));
printf("%s\n",a);
memcpy(a+4, &c, sizeof(WORD));
printf("%s\n",a);
// getch();
//
getchar();
return 0;
}
output:
000000000000000000000000
00(
00(
做么第二个memcpy没有把c copy过去的?请各位大大指点下。。谢谢~
|
|
|
|
|
|
|
|
|
|
|
发表于 25-5-2009 09:37 PM
|
显示全部楼层
回复 1# smho_1110 的帖子
一個 string "hello"在memory裏面其實佔6個位置,h,e,l,l,o,\0(ascii code 0)
因爲ascii code 0用來代表一個string的結束
用以下print出16進制表示的a的内容看看
int i;
for (i = 0; i < 12; i++)
printf("%02X", a);
printf("\n");
一開始a的内容如下
303030303030303030303030
當成string會得到000000000000加上未知(這裡在上面有些地方有問題,a是12個bytes但memset操作到不屬於a的12bytes,除此以外,byte裏面沒有ascii code 0結束,因爲剛好第25個bytes是0才會顯示24個0的string)
第一次memcpy后a的内容如下
303028003030303030303030
當成string會得到00(
第4個byte是ascii code 0,表示string結束,不管後面内容為何
第二次memcpy后a的内容如下
303028000400303030303030
當成string會得到00(
第4個byte是ascii code 0,表示string結束,不管後面内容為何 |
|
|
|
|
|
|
|
|
|
|
发表于 25-5-2009 09:54 PM
|
显示全部楼层
1.) 1 BYTE = unsigned char = 8bit, 所以
BYTE* a = new BYTE[12];
memset(a, '0', 24);
是非常不对..write across boundary, 容易造成memory corruption
2.) DWORD = 2 x WORD = 4 byte = 32bit
x86 架构下电脑储存排列方式为 little endian, 也就是说 0xABCD 在硬盘上的排列为 xx xx xx CD AB xx xx xx
DWORD b = 0x28, 会被编译为 c = 0x00 00 00 28
储存排列为 xx xx xx 28 00 00 00 xx xx xx
DWORD c = 4, 会被编译为 c = 0x00 00 00 04
储存排列为 xx xx xx 04 00 00 00 xx xx xx
3.) memcpy 肯定有把资料抄过去, 只不过printf 没把他们显示出来.
为什么呢?很简单..
printf("%s", a); 会把所有从记忆位置a的字符(character)显示出来,直到遇到一个null terminating character, 也就是 0x00
当你写 memset(a, '0', 24);
你并没有把 0x00 写进记忆里。。而是写了 0x30 (ASCII "0" @ ZERO), 电脑记忆里会是 30 30 30 30 30 30 30 30 ..... |
|
|
|
|
|
|
|
|
|
|

楼主 |
发表于 26-5-2009 09:55 AM
|
显示全部楼层
结合以上两位的解释,我把memset(a, '0', 24);改成 memset(a, '\0', 12);
我用printf(%s, a),就只有一片空白(Null)
我用printf(%x,a),结果是:
365c80
365c80
365c80
怎么我print 不到你们所说的 30 30 30 30 ...呢? |
|
|
|
|
|
|
|
|
|
|
发表于 26-5-2009 09:25 PM
|
显示全部楼层
原帖由 smho_1110 于 26-5-2009 09:55 AM 发表 
结合以上两位的解释,我把memset(a, '0', 24);改成 memset(a, '\0', 12);
我用printf(%s, a),就只有一片空白(Null)
我用printf(%x,a),结果是:
365c80
365c80
365c80
怎么我print 不到你们所说的 30 30  ...
因为 30 30 30 30 30 实在电脑记忆里的value, printf 显示的是 ASCII character.... |
|
|
|
|
|
|
|
|
|
|

楼主 |
发表于 27-5-2009 10:25 AM
|
显示全部楼层
回复 5# yeenfei 的帖子
谢谢你的指点  |
|
|
|
|
|
|
|
|
| |
本周最热论坛帖子
|