码迷,mamicode.com
首页 > 编程语言 > 详细

【C语言】 字符串的内存拷贝处理函数

时间:2015-09-23 01:24:14      阅读:205      评论:0      收藏:0      [点我收藏+]

标签:c语言   字符拷贝   menmove   

    这篇博文我主要是想写一下函数库中的memcpy函数,

    对于字符串来说,我们运用字符串<string.h>中的str类别的函数,但是我们还有一些关于内存的拷贝函数。他们操作的对象是内存,然后可以接受任何类型的数据进行拷贝。

    这个是<memory.h>里面的memcpy,然后我们一起查看一下MSDN看一看他的原型:

    void *memcpy(void *dest,const void *src,size_t count);

    与strcpy不同的就是添加了第三个参数,确定操作的字节数,然后参数类型还有返回类型都是void*

,这表示他可以拷贝任意类型的数据。

    然后我们看一下实现:

    memcpy:


void *my_memcpy(void *str,const void *Dstr,int count)                      
   //从内存地址开始改变,并确定改变长度,所以用万能类型去接受
{
             char *pstr = (char *)str;
             char *pDstr = (char *)Dstr;
            assert((str!=NULL) && (Dstr != NULL));
             if(str == Dstr)                            
             //位置相同情况下直接返回需要改变的
                         return (char *)Dstr;
             while(count-- > 0)
            {
                        *pstr++ = *pDstr++;
            }
             return str;
}

    然后会出现一个问题,如果我们拷贝的数据中Dstr的起始位置在STR操作之间,那么在改变str时会出现副作用,将导致我们的拷贝结果不正确,所以我们应该考虑到会覆盖的情况。在函数库中有一个memmove函数。

memmove:

    

void *my_memmove(void *pst,const void *Dpst,int size)
{          
             void *p = pst;
             char *pstA = (char *)pst;
             char *pstB = (char *)Dpst;
            assert((pst != NULL) &&(Dpst != NULL));
             if(pstB<pstA< pstB+size)
            {
                                     while(size--)
                        {
                                    *(pstA+size) = *(pstB+size);
                        }
            }
             else
            {
                         while(size--)
                        {
                                    *pstA++ = *pstB++;
                        }
            }
             return p;
}

就是遇到被拷贝的空间起始处在拷贝空间中,将会遇到拷贝内存覆盖的现象。在这种情况下我们将考虑从尾部进行拷贝。所以进行了判断。

本文出自 “剩蛋君” 博客,请务必保留此出处http://memory73.blog.51cto.com/10530560/1697227

【C语言】 字符串的内存拷贝处理函数

标签:c语言   字符拷贝   menmove   

原文地址:http://memory73.blog.51cto.com/10530560/1697227

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!