【转】【C/C++】实现memcpy函数

本文转自:http://my.oschina.net/renhc/blog/36345

面试中如问到memcpy的实现,那就要小心了,这里有陷阱。

先看下标准memcpy()的解释:

?


1

2

void *memcpy(void *dst, const void *src, size_t n);

//If copying takes place between objects that overlap, the behavior is undefined.

注意下面的注释,对于地址重叠的情况,该函数的行为是未定义的。

事实上所说的陷阱也在于此,自己动手实现memcpy()时就需要考虑地址重叠的情况。

另外,标准库也提供了地址重叠时的内存拷贝函数:memmove(),那么为什么还要考虑重写memcpy()函数呢?

因为memmove()函数的实现效率问题,该函数把源字符串拷贝到临时buf里,然后再从临时buf里写到目的地址,增加了一次不必要的开销。

下面给出memcpy()的实现,为了与标准库函数区分,我们实现其包裹函数:

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

void *Memcpy(void *dst, const void *src, size_t size);

int main(int argc, char *argv[])

{

    char buf[100] = "abcdefghijk";

    //memcpy(buf+2, buf, 5);

    Memcpy(buf+2, buf, 5);

    printf("%s\n", buf+2);

}

void *Memcpy(void *dst, const void *src, size_t size)

{

    char *psrc;

    char *pdst;

    if(NULL == dst || NULL == src)

    {

        return NULL;

    }

    if((src < dst) && (char *)src + size > (char *)dst) // 自后向前拷贝

    {

        psrc = (char *)src + size - 1;

        pdst = (char *)dst + size - 1;

        while(size--)

        {

            *pdst-- = *psrc--;

        }

    }

    else

    {

        psrc = (char *)src;

        pdst = (char *)dst;

        while(size--)

        {

            *pdst++ = *psrc++;

        }

    }

    return dst;

}

时间: 2024-10-14 19:14:35

【转】【C/C++】实现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>; C++中使用#include <cstring>

memcpy函数

实现1:<高质量c++,c编程指南> void *mymemcpy(void *dst,const void *src,size_t num) { assert((dst!=NULL)&&(src!=NULL)); //assert(des>=src+num||src>dst+num); byte * psrc = (byte *)src;//byte 既为unsigned char类型 byte * pdst = (byte *)dst; while(num--&

实现 memcpy 函数

memcpy() 的解释: void* memcpy(void* dst, const void* src, size_t n); // if copying takes place between objects that overlap, the behavior is undefined. 因此自己动手实现 memcpy()时需要考虑地址重叠的情况. 另外,标准库也提供了地址重叠时的内存拷贝函数:memmove(), memmove()把源字符串拷贝到临时buf 里,然后再从临时 buf

memcpy函数详解

函数原型: void *memcpy(void *dest,void *src, unsigned int count) { assert((dest!=NULL)&&(src!=NULL)); if(dest==src) return src; char* d=(char*)dest; char* s=(char*)src; while(count--> 0) *d++=*s++; return dest; } 这是一个memcpy的源代码,在函数里面生成临时指针,这样不会改变原始

memcpy函数用法

memcpy函数用法 .分类: VC++ VC++ mfc matlab 2011-12-01 19:17 14538人阅读 评论(0) 收藏 举报 null 原型:extern void *memcpy(void *dest, void *src, unsigned int count); 用法:#include <string.h> 功能:由src所指内存区域复制count个字节到dest所指内存区域. 说明:src和dest所指内存区域不能重叠,函数返回指向dest的指针. 举例: //

C语言中strcpy与memcpy函数实现与区别

C语言中strcpy与memcpy函数是怎么实现的又有哪些区别呢?下面就与我来简单的介绍下吧,希望大家多给点意见,欢迎评论纠正错误. 6.2 字符串与数组 字符串一般是用字符数组的方式存储,例如下面的str定义: char str[] = "123456"; 这里str是一个字符数组,它存放了一个字符串"123456",由于字符串还有一个结束符"\0",所以此数组的长度为7而不是6. 6.2.1 strcpy函数与memcpy函数 strcpy和

memcpy函数 和 memmove函数 原码

原型:extern void *memcpy(void *dest, void *src, unsigned int count); 用法:#include <string.h> 功能:由src所指内存区域复制count个字节到dest所指内存区域. 说明:src和dest所指内存区域不能重叠,函数返回指向dest的指针. 举例: // memcpy.c #include <syslib.h> #include <string.h> main() { char *s=&

memcpy函数使用

#include<iostream> using namespace std; int main() { //memcpy函数 char d[20]; //声明数组 char *str="Hellow word"; memcpy(d,str,strlen(str)); d[strlen(str)]=0; //末尾添加0 表示该字符串结束 cout<<d; getchar(); }

memset memcpy函数

memset 函数 1.其头文件为: #include<memory> 或者#include<string> 2.原型    看清是对每个字节,不是其类型 void *memset(void *s, int ch, size_t n); 函数解释:将s中前n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s . memset:作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法[1]  . eg:int