您当前的位置:首页 > 生活常识 > 正文

memcpy怎么用(memcpy用法总结)

memcpy怎么用(memcpy用法总结)

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


声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,谢谢。

上一篇: 金华市哪个车站经过g1640次列车?奔腾G1640核显对比HD5450

下一篇: 处理海鲜应该用什么手套? 腈怎么读丁腈手套



推荐阅读