Chinaunix首页 | 论坛 | 博客
  • 博客访问: 471805
  • 博文数量: 134
  • 博客积分: 3056
  • 博客等级: 中校
  • 技术积分: 1150
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-14 15:53
文章分类
文章存档

2013年(1)

2010年(133)

我的朋友

分类: C/C++

2010-11-07 23:15:04

1. 先看memcpy的原型

原型:extern void *memcpy(void *dest, void *src, unsigned int count);
用法:#include <string.h>;
功能:由src所指内存区域复制count个字节到dest所指内存区域。
说明:src和dest所指内存区域不能重叠,函数返回指向dest的指针(VC6下可以重叠,后面给出验证)


2. 内存布局情况
   1)源地址和目的地址不重叠;
    low--------------->high(大端模式)
                   src

                  |------------|

    |-----------|                |------------|

    dest                         dest

  2)源地址和目的地址重叠;

   src

  |---------------------|
        |---------------------|
        dest

3. 实现

如果没有重叠,直接从源地址的开始方向复制;如果目标地址在源区域内(dest>src && dest从源地址的末尾开始反方向复制。


4.源码(C实现,VC6.0)

#include <stdio.h>
#include <string.h>

#define LEN 5

void *myMemCopy(void *dest,const void *src,size_t count)
{
    char *pDest=(char *)(dest);
    const char *pSrc=(const char *)(src);

    //目的地址和源地址重叠,从源地址的末尾方向开始拷贝
     if( pDest>pSrc && pDest<pSrc+count )
    {
        pDest = pDest + count-1;
        pSrc = pSrc + count-1;
        while(count--){
            *pDest-- = *pSrc--;
        }
    }

    //目的地址和源地址不重叠,从源地址的开始方向拷贝
    else
    {
        while(count--){
             *pDest++ = *pSrc++;
        }
    }

    return pDest;
}

void printString(char *str, unsigned int n)
{
    while(n--){
        putchar(*str++);
    }
    putchar('\n');
}


int main()
{

    char str1[] = "hello, world!";
    char str2[] = "hello, world!";

    myMemCopy(str1+1, str1, LEN);
    printString(str1+1, LEN);

    memcpy(str2+1, str2, LEN);
    printString(str2+1, LEN);

    return 0;
}


5. 参考目录
1. 
阅读(3520) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~