在VS2010开发中,用到memcpy函数,虽然知道与在VC6.0中的用法是区别,但是还是碰了不少壁,在此总结一番,详情见windows核心编程。
1、在VC6.0中,默认的是ASCII字符集,因此以下函数会正常执行
char str[256];
CString strTemp = "helloworld"; //在MFC中测试。因此用得是CString
memcpy(str ,strTemp ,strTemp.GetLength() + 1); //末尾加一是为了拷贝'\0'。
str中的值会成为helloworld。在内存中占的单元数是11个
2、同样的程序在VS2010中会拷贝不成功。
因为VS2010默认为UNICODE,memcpy在拷贝的时候将str的两个内存单元用来存放一个字节,也就是要成功保存,占用字节数
为11*2 = 22个
因此程序应为:
char str[256];
CString strTemp = "helloworld";
memcpy(str ,strTemp ,strTemp.GetLength() *2 + 2);
3 、可能你已经想到用TCHAR来声明,即如下:
TCHAR str[256];
CString strTemp = "helloworld";
memcpy(str ,strTemp ,strTemp.GetLength() + 1);
经过测试,这样一样不会成功
原因是:memcpy函数只对内存单元进行操作,TCHAR str[256],只是多申请了256个单元,总单元数为256*2个,即相当于声明为:
char str[512]而已。
4、综上所述。在ASCII字符集中,memcpy函数操作的是将一个字节占用一个内存单元。
在UNICODE字符集中,占用的是两个内存单元
拷贝的时候,要注意第三个参数的使用,必须分配够足够的内存单元。
- 标 题:memcpy在unicode,ASCII中的用法区别
- 作 者:朱哥哥
- 时 间:2011-11-27 17:47:23
- 链 接:http://bbs.pediy.com/showthread.php?t=143435