C语言::模拟实现memcpy函数 - 高小调博客

C语言::模拟实现memcpy函数

题目要求

编写一个C语言程序模拟实现memcpy函数.

(我们依然先模拟实现memcpy函数,然后再对照string.h库中memcpy函数的实现,对比与大师之间的差距.)

函数分析

memcpy原型:void *memcpy(void *dest,const void *src,size_t n);

memcpy功能:资源内存(src所指向的内存区域)拷贝n个字节到目标内存(dest所指向的内存区域).

memcpy返回值:最终返回dest

我们了解memcpy函数大体信息之后,不难分析出模拟实现memcpy函数的算法.

(更多信息详见:C语言::memcpy函数功能、原型、用法及实例)

算法分析

首先,memcpy函数可以对任意类型数据进行操作.

因此我们将参数的数据类型设置为void *,可以接受任意类型的指针.

正如上文提到memcpy函数是一个字节一个字节进行拷贝的,因此我们将dest、src强制转换成char *.

然后进行循环n次解引用赋值操作,dest++,src++.

最终返回dest最初的值.

注意:src和dest所指内存区域不能重叠!!!

模拟实现核心代码

//模拟实现memcpy函数
void *my_memcpy(void *dest,const void *src,size_t n){
	char *pdest = (char *)dest;
	char *psrc = (char *)src;
	void *ret = dest;
	//断言
	assert(dest!=NULL);
	assert(src!=NULL);
	while(n--){
		*pdest++ = *psrc++;
	}
	return ret;
}

string.h库核心代码

//Windows下string.h库中memcpy函数实现的核心代码(删除了条件编译部分)
void* memcpy(void* dst,const void* src,size_t count){
	void* ret=dst;
	while(count--){
        *(char *)dst = *(char *)src;
        dst = (char *)dst+1;
        src = (char *)src+1;
    }
	return (ret);
}

完整测试代码

/*
*本代码由高小调原创,版权归高小调博客所有 
*作者:高小调
*日期:2016-8-9
*代码功能:模拟实现memcpy函数
*集成开发环境:Microsoft Visual Studio 2010 
*/
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
//模拟实现memcpy
void *my_memcpy(void *dest,void *src,size_t n){
	char *pdest = (char *)dest;
	char *psrc = (char *)src;
	void *ret = dest;
	assert(dest!=NULL);
	assert(src!=NULL);
	while(n--){
		*pdest++ = *psrc++;
	}
	return ret;
}
//window下memcpy实现(删除了条件编译部分)
void* memcpy(void* dst,const void* src,size_t count){
	void* ret=dst;
	while(count--){
        *(char *)dst = *(char *)src;
        dst = (char *)dst+1;
        src = (char *)src+1;
    }
	return (ret);
}
int main(){
    char src1[]="Welcome to Gxd Blog!";
    char dest1[30]={0};
    int src2[]={0,1,2,3,4,5,6,7,8,9};
    int dest2[10]={0};
    int i = 0;
    //拷贝字符串
    my_memcpy(dest1,src1,sizeof(src1));
    //拷贝整型数组
    my_memcpy(dest2,src2,sizeof(src2));
    printf(dest1);
    printf("\n");
    for(i=0; i<sizeof(dest2)/sizeof(dest2[0]);i++){
        printf("%d ",dest2[i]);
    }
    printf("\n");
    system("pause");
    return 0;
}

输出

模拟实现memcpy函数输出结果

    函数列表
  1. printf()函数功能、原型、用法和实例
  2. assert()宏功能、原型、用法和实例
  3. memcpy()函数功能、原型、用法及实例

小调祝你一切安好.

本文由高小调博客原创!

原文地址:http://gaoxiaodiao.com/p/25.html

如欲转载,请注明出处!

PS:嘎嘎...C语言终于结课了,下午5点以后终于有大把的时间可以用来尽情地挥霍了!

这些时间用来干啥呢?

瑜伽?每天教练班强度已经够大了,休息休息吧.

游戏?很久没玩LOL,估计现在已经比小学生还坑了吧!

编程?编个啥代码玩玩呢...?想不出来!

约妹?诶?这个不错!!!打开钱包一看,只剩下了9.52...

人生的痛苦根源之一就在于想得太多,钱包太小!

我还是默默地更新博客吧!

(未完待续...)

上一篇:
下一篇: