Memcpy指的是C和C使用的内存复制函数,memcpy的作用是从源src指向的内存地址开始复制n个字节到目标dest指向的内存地址开始。从源src指向的内存地址的起始位置复制n个字节到目标dest指向的内存地址的起始位置。
memcpy如何使用memcpy函数将资源内存(src指向的内存区)复制到目标内存(dest指向的内存区);多少份?有一个大小变量控制复制的字节数;函数原型:void *memcpy(void *dest,void *src,unsigned int count)。
用法:
(1)可以复制任意类型的对象,因为函数的形参类型是void*(未定义类型指针),也就是说传入的实参可以是int*、short*、char*等等。
不过由于函数复制过程是一个字节一个字节的,所以实际操作中要把void*强制转换成char*,这样才能保证在添加指针的时候一次添加一个字节,呵呵。
函数源代码实现:
void *memcpy1(void *desc,const void * src,size_t size)
{
if((desc==NULL) (src==NULL))
{
返回NULL
}
unsigned char * desc 1=(unsigned char *)desc;
unsigned char * src 1=(unsigned char *)src;
而(大小- 》0)
{
* desc1=* src1
desc1
src1
}
归还desc;
}
int _tmain(int argc,_TCHAR* argv[])
{
int dest[2]={ 0 };
const char src[5]="1234";
//printf(src);
memcpy1(dest,src,sizeof(src));
//*(dest 5)=“/0”;
printf((char *)dest);
int m=-1;
返回0;
}
注意:(1)void*必须返回值(指针),与void不同!
(2)首先需要判断指针的值不能为空。如果desc为空,内存空间无法复制,src为空,说明没有副本;所以返回之间;
(3)空字符串表示内容为0,NULL为0,不是字符串;两者不等价;
(4)int dest[2]={ 0 };这是初始化int类型数组的方法;如果是char类型,使用CHAR A[5]="1234";注意数组下标比实际看到的字符数多,因为还有'/0 '
(5)printf((char *)dest);在这句话中,char类型的src的内存转移到int类型的dest并强制转换成char类型,然后打印;因为不能直接看到int dest的内容;因为有unsigned char * desc 1=(unsigned char *)desc;所以字符可以保存在dest中,dest指向的内存是4字节长。强行转换成char就是把四个字节一个一个的分成字节,这样就可以一个一个的看到字符了。如果定义为chardest[5]="1234";没必要转型;呵呵,表达起来真的很累;
(6)memcpy1(dest,src,sizeof(src));注意里面的sizeof(src),包括字符串的终止符'/0 '所以不用担心printf(dest);但是如果用memcpy1(dest,src,4);没有'/0 '*(dest 5)='/0 '这保证了一个完整的字符串;
(7)如果它被初始化:
char dest[1024]="12345666";//{0};
const char src[5]="3333";
然后在复制的时候,如果用memcpy1(dest,src,sizeof(src));然后printf(dest);是3333。
If memcpy1(dest,src,4);然后printf(dest);是66;因为上面的sizeof(src)包含'/0 '所以用'/0 '复制过去的字符串。
最后只有3333,如果传递了四个字符,'/0 '是第五个字符,那么在dest[1024]]中就以'/0 '结尾,所以是66。
注意字符串的'/0 '问题!
实际应用:
unsigned char g _ pData[1024]="";
DWORD g _ dw offset=0;
bool PackDatatoServer(const unsigned char * pData,const unsigned int uSize)
{
memcpy(g_pData g_dwOffset,pData,uSize);
g _ dwOffset=uSize
//g _ pData=uSize;
返回true
}
void main()
{
const unsigned char a[4]="123";
PackDatatoServer(a,3);
PackDatatoServer(a,1111);
int b=-1;
}
PackDatatoServer()的作用是将每个资源内存复制到目标内存中,而且是累积复制;即下一个副本后面跟着上一个副本;显然使用了memcpy函数;实现原理是用一个全局变量g_dwOffset来保存前一个副本的长度。起初,我没有想到这一点。结果每份都是一次性的,下一份就把上一份冲走了。所以使用全局变量来记录副本的长度;第二个需要注意的是,在复制过程中,注意不要改变目标指针的方向,即目标指针始终指向初始化时所指的位置;那么如何实现累积复制呢?
就是使用指针偏移量;第一次实现时,g _ pData=uSize写入函数,这种写法可以达到指针位移的目的,但是指针指向也发生了变化;另外:g _ pData=uSize还有一个错误:leftopera和mustbe l-value,因为地址赋给了一个不可变的指针!例如:
char a[100];
char * p=new char[10];
a=p;//这里有一个错误。注意:数组的第一个地址也是const指针,指向一个固定的~ ~
char * const PP=new char[1];
PP=a;//也不对
所以不能改变第一个地址,还要满足累积赋值(也就是赋值的时候要开始给下一个内存块赋值,想到添加指针),所以如果要给函数参数添加指针,要充分了解memcpy的实现过程,这是一个逐字符的赋值。如果要连续赋值,应该将指针指向连续内存的第一个地址。
Memcpy用法总结了C和C使用的内存复制函数,memcpy函数的作用是从源src指向的内存地址开始复制n个字节到目标dest指向的内存地址开始。
1、功能原型
void *memcpy(void *dest,const void *src,size _ t n);
2、功能
从源src指向的内存地址的起始位置复制n个字节到目标dest指向的内存地址的起始位置。
3、必需的头文件
在C语言中使用# include 《string.h》;
#include 《cstring》和#include 《string.h》都可以在c中使用。
4、返回值
函数返回一个指向目标的指针。
5、描述
1.source和destin所指向的内存区域可能会重叠,但是如果source和destin所指向的内存区域重叠,那么这个函数就不能保证Source的重叠区域在复制之前不会被覆盖。Memmove可以用来处理重叠区域。函数返回一个指向destin的指针。
2.如果目的数组destin本身已经有数据,执行memcpy()后,会覆盖原来的数据(最多n个)。如果要追加数据,应该在每次执行memcpy后,将目标数组地址增加到要追加数据的地址。
注意:源和目的都不一定是数组,任何可读可写的空间都可以使用。
6、功能实现
标签:指针指向dest