佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

搜索
查看: 1241|回复: 5

memcpy 的问题

[复制链接]
发表于 25-5-2009 05:53 PM | 显示全部楼层 |阅读模式
我遇到了一些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过去的?请各位大大指点下。。谢谢~
回复

使用道具 举报


ADVERTISEMENT

发表于 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&#160;&#160;...


因为 30 30 30 30 30 实在电脑记忆里的value, printf 显示的是 ASCII character....
回复

使用道具 举报

 楼主| 发表于 27-5-2009 10:25 AM | 显示全部楼层

回复 5# yeenfei 的帖子

谢谢你的指点
回复

使用道具 举报

Follow Us
您需要登录后才可以回帖 登录 | 注册

本版积分规则

 

ADVERTISEMENT



ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


版权所有 © 1996-2026 Cari Internet Sdn Bhd (483575-W)|IPSERVERONE 提供云主机|广告刊登|关于我们|私隐权|免控|投诉|联络|脸书|佳礼资讯网

GMT+8, 30-4-2026 05:15 AM , Processed in 0.064092 second(s), 12 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表