在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字符集中,占用的是两个内存单元

拷贝的时候,要注意第三个参数的使用,必须分配够足够的内存单元。






  • 标 题:答复
  • 作 者:朱哥哥
  • 时 间:2011-11-27 19:01:37

只需分配足够的空间即可,主要是第三个参数要正确设置为在unicode下所以的内存单元数。一般为ascii下得两倍