文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>笔试题02-自己实现memcpy

笔试题02-自己实现memcpy

时间:2010-11-07  来源:guocai_yao

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<src+count),那就会发生重叠,从源地址的末尾开始反方向复制。


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. http://www.chinaitpower.com/A/2001-10-17/2036.html 2. http://blog.csdn.net/gengshenghong/archive/2010/05/30/5634776.aspx 3. http://www.cublog.cn/u3/115019/showart_2247758.html
相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载