实现 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 的问题

?





1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

void* memcpy(void* dst, 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;

}

  

B公司面试第一道题

1. 没能考虑到 src, dst 重复的情况

2. strlen 的参数只能是 char*

3. 对 (void*) 这种东西,不能用 src[0] 而应该是 *src, *dst

实现 memcpy 函数,布布扣,bubuko.com

时间: 2024-12-18 11:38:55

实现 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函数详解

函数原型: 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/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. 注意下面的注释,对于地址重叠的情况,

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