浅析memcpy内存拷贝函数

浅析memcpy函数原型

C语言程序员钟爱memcpy函数,面试时考官总会让你写一个memcpy函数,笔试时候也总有这个题目,那这究竟是为什么呢?要想知道这个答案,还得从头说起。
【浅析memcpy内存拷贝函数】话说C语言诞生之初,便与硬件有着天然的联系,使我们不得不深入基层,了解内存,操作内存。就如为将者需熟读兵书、通晓天文、地理一样,我们要搞清各种元素的内存形态、位置及相应的操作方法,熟悉内存操作是对C语言的基本要求,大概这就是大家钟爱memcpy的原因吧。
闲言少叙,开始正题:
1. memcpy函数的原型
void *memcpy(void *dest,void *src,unsigned intsize)

乍一看到处是指针,还挺唬人,实际呢,就是几个地址啦:
1. dest–>目标内存首地址
2. src–>源内存首地址
3. size–>拷贝内存的字节数量
4. 返回值–>目标内存首地址或者NULL
说起地址,当然得明白该地址所指内存以什么形式组织的啦,那简单啦,int型4个字节一存,char型1个字节一存,结构体根据具体结构排布内存。这就是void存在的意义喽,void能代表以上所有类型内存喽。但size是指字节却亘古不变哦,啊,为什么?
2. memcpy函数的实现 前面讲到size必须不能改变为字节数,其实啊,C语言里面内存操作的基本单元就是字节啊,不论是int、字符串还是结构体,都是以字节为最小单位,所以不论任何形势的内存拷贝,就一个字节一个字节的搬运,保证没问题的啦。
void *memcpy(void *dest,void *src,unsigned intsize) { char *d=(char *)dest; //以字节形式来操作喽,字节是内存操作最小单元 char *s=(char*)src; //把源地址转到以字节为单位的字节指针中 if(d==NULL||s==NULL||size<0) returnNULL; //地址是否为空 while(size--) *d++=*s++; //搬运开始吧,一个一个来 return dest; // 返回目标内存地址 }

3. 关于memcpy的一点思考 memcpy应用比较灵活,不限制类型,他是void型的,各种类型都可以拷贝。但须注意他的拷贝方式,一个字节一个字节的搬运,这就导致有内存重叠的可能啊,如果是整体搬运,那就不需考虑了。话说memcpy没有测地解决内存重叠的问题,那这个问题留给了谁呢?猜猜看,那就是memmove函数喽。欲知后事如何,且听下回分解吧。

    推荐阅读