欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

memcpy在unicode,ASCII中的用法区别

memcpy在unicode,ASCII中的用法区别



在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字符集中,占用的是两个内存单元
拷贝的时候,要注意第三个参数的使用,必须分配够足够的内存单元。

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功