memcpy实现

typedef unsigned int size_t;
void * my_memcpy ( void *dest, const void *src, size_t num )
{
    void* ret = dest;
    while (num--)
    {
        *(char*)dest = *(char*)src;
        dest = (char*)dest + 1;
        src = (char*)src + 1;
    }
    return ret;
}

//to solve memory overlap
void *my_memcpy(void *dst, const void *src, size_t count)
{
     char *pdst = static_cast<char *>(dst);
     const char *psrc = static_cast<const char *>(src);  

     if (pdst > psrc && pdst < psrc + count)
     {
           for (int i = count - 1; i >= 0; i--)
           {
                pdst[i] = psrc[i];
           }
     }
     else
     {
           for (int i = 0; i < count; i++)
           {
                pdst[i] = psrc[i];
           }
     }
     return dst;
}   

C语言中使用#include <string.h>;
C++中使用#include <cstring>和#include <string.h>都可以。
1.source和destin所指的内存区域可能重叠,但是如果source和destin所指的内存区域重叠,那么这个函数并不能够确保source所在重叠区域在拷贝之前不被覆盖。而使用memmove可以用来处理重叠区域。函数返回指向destin的指针.
2.如果目标数组destin本身已有数据,执行memcpy()后,将覆盖原有数据(最多覆盖n)。如果要追加数据,则每次执行memcpy后,要将目标数组地址增加到你要追加数据的地址。
注意:source和destin都不一定是数组,任意的可读写的空间均可。

6函数实现
微软中:
void*__cdeclmemcpy(
void*dst,
constvoid*src,
size_tcount
)
{
void*ret=dst;
#ifdefined(_M_MRX000)||defined(_M_ALPHA)||defined(_M_PPC)
{
externvoidRtlMoveMemory(void*,constvoid*,size_tcount);
RtlMoveMemory(dst,src,count);
}
#else/*defined(_M_MRX000)||defined(_M_ALPHA)||defined(_M_PPC)*/
/*
*copyfromloweraddressestohigheraddresses
*/
while(count--){
*(char*)dst=*(char*)src;
dst=(char*)dst+1;
src=(char*)src+1;
}
#endif/*defined(_M_MRX000)||defined(_M_ALPHA)||defined(_M_PPC)*/
return(ret);
}
coreutils中:
void*memcpy(void*destaddr,voidconst*srcaddr,size_tlen)
{
char*dest=destaddr;
charconst*src=srcaddr;
while(len-->0)
{
*dest++=*src++;
}
returndestaddr;
}
Linux中:
void*memcpy(void*dest,constvoid*src,size_tcount)
{
assert(dest!=NULL&&src!=NULL);
char*tmp=dest;constchar*s=src;
for(size_ti=0;i<count;i++)
{
tmp[i]=s[i];
}
returndest;
}
程序例example1
作用:将s中的字符串复制到字符数组d中。
//memcpy.c
#include<stdio.h>
#include<string.h>
intmain()
{
char*s="GoldenGlobalView";
chard[20];
clrscr();
memcpy(d,s,(strlen(s)+1));
printf("%s",d);
getchar();
return0;
}
输出结果:Golden Global View
example2
作用:将s中第13个字符开始的4个连续字符复制到d中。(从0开始)
#include<string.h>
intmain(
{
char*s="GoldenGlobalView";
chard[20];
memcpy(d,s+12,4);//从第13个字符(V)开始复制,连续复制4个字符(View)
d[4]=‘\0‘;//memcpy(d,s+14*sizeof(char),4*sizeof(char));也可
printf("%s",d);
getchar();
return0;
}
输出结果: View
example3
作用:复制后覆盖原有部分数据
#include<stdio.h>
#include<string.h>
intmain(void)
{
charsrc[]="******************************";
chardest[]="abcdefghijlkmnopqrstuvwxyz0123as6";
printf("destinationbeforememcpy:%s\n",dest);
memcpy(dest,src,strlen(src));
printf("destinationaftermemcpy:%s\n",dest);
return0;
}
输出结果:
destination before memcpy:abcdefghijlkmnopqrstuvwxyz0123as6
destination after memcpy: ******************************as6

与strcpy函数的区别
strcpy和memcpy主要有以下3方面的区别。
1、复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。
2、复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符"\0"才结束,所以容易溢出。memcpy则是根据其第3个参数决定复制的长度。
3、用途不同。通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy
时间: 2024-10-07 04:14:55

memcpy实现的相关文章

实现memcpy和memmove函数

题目: 自己定义一个函数,实现my_memcpy和my_memmove函数. 题目分析: memcpy函数主要实现的是内存的拷贝,函数接受任意类型的参数,并且有拷贝个数的限制,函数与strcpy函数在功能上有相似点,也有不同点.memmove函数在memcpy函数的基础上解决了内存重叠的问题.下面是memcpy和memmove函数的实现: my_memmove函数: #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include &l

memset memcpy

memset与memcpy的用法: void *memset(void *s,int c,size_t n)总的作用:将已开辟内存空间 s 的首 n 个字节的值设为值 cmemset可以方便的清空一个结构类型的变量或数组memcpy用来做内存拷贝,你可以拿它拷贝任何数据类型的对象,可以指定拷贝的数据长度.例:char a[100],b[50]; memcpy(b, a, sizeof(b));注意如用sizeof(a),会造成b的内存地址溢出.

strcpy和memcpy的区别

strcpy提供了字符串的复制.即strcpy只用于字符串复制,并且它不仅复制字符串内容之外,还会复制字符串的结束符. 已知strcpy函数的原型是:char* strcpy(char* dest, const char* src);memcpy提供了一般内存的复制.即memcpy对于需要复制的内容没有限制,因此用途更广. char * strcpy(char * dest, const char * src) // 实现src到dest的复制 { if ((src == NULL) || (d

memcpy与memmove

函数原型: void* memcpy(void *dst,void const *src,size_t count) void* memmove(void *dst,void const *src,size_t count) 头文件: #include<string.h> 引入: 字符串由'\0'结尾,所以字符串内部不能包含任何'\0'字符('\0'的ASCII值为0),否则我们将读不到'\0'后的字符内容.但是,非字符串内部包含零值的情况并不罕见,我们无法利于其它字符串函数来处理这类数据.所

浅析在类模版中构建成员函数时,使用memcpy产生的副作用

一般情况下我们在对类模版中的成员函数进行构建时会经常对一些数据进行复制拷贝,而通常情况下我们都不提倡用memcpy进行拷贝,因为在类模版中所传进来的类型可以是内置类型也可以是非内置类型,除非你在成员函数中使用memcpy前进行类型萃取,否则它所带来的副作用的后果也是很可怕的.memcpy在对内置类型可正常拷贝,而在对非内置类型拷贝时会出现浅拷贝的现象. 下面我们可以通过一个简单的顺序表程序来分析memcpy对非内置类型所产生的副作用: #include<iostream> #include&l

strcpy, memcpy, memset函数

一. strcpy函数 原型声明:char *strcpy(char* dest, const char *src); 头文件:#include <string.h> 和 #include <stdio.h> 功能:把从src地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间 说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串. 返回指向dest的指针. 实现代码: char * strcpy(char * strDest,c

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(拷贝内存内容

/*memcpy(拷贝内存内容) 相关函数 bcopy,memccpy,memcpy,memmove,strcpy,strncpy 表头文件 #include<string.h> 定义函数 void * memcpy (void * dest ,const void *src, size_t n); 函数说明 memcpy()用来拷贝src所指的内存内容前n个字节到dest所指的内存地址上.与strcpy()不同的是,memcpy()会完整的复制n个字节,不会因为遇到字符串结束‘\0‘而结束.

strcpy和memcpy的编程实现

1 char *strcpy(char *dest,char *src) 2 { 3 char *d=dest;//输入的参数进行备份 4 char *s=src; 5 6 int count=0; 7 8 assert(dest!=NULL && src!=NULL);//指针合法性检测 if(src==dest) return src; 11 count = strlen(src) +1;//计算src字符串长度 12 if(count <= 1) return 0;//src字

C++面试题4:memcpy的用法

C++面试题4:memcpy的用法 memcpy函数用于把资源内存(src所指向的内存区域)拷贝到目标内存(desk所指向的内存区域):拷贝多少个?有一个size变量控制 用法:可以拷贝任何类型的对象,因为函数的参数类型是void*,也就是说传进去的实参可以是int *,short*,char*等等. 原型:void *memcpy(void *desc, void *src, unsigned int count) 实现memcpy void *memcpy(void *desc,const