实现memcpy

需要考虑的问题:

1、参数检查

2、具体问题相关: 区域重叠


代码地址: https://github.com/huntinux/C/blob/master/memcpy.c


#include 
#include 

/*
man memcpy:
SYNOPSIS
       #include 

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

DESCRIPTION
       The  memcpy()  function  copies  n bytes from memory area src to memory area dest.  
	   The memory areas must not overlap.  Use memmove(3) if the memory areas do overlap.
*/

// 标准的memcpy没有处理区域重叠,如果区域会重叠请使用memmove

void *
memcpy(void *dest, const void *src, size_t n)
{
	char *pdest; 
	const char *psrc;
	int i ;

	pdest = (char *)dest;
	psrc = (const char *)src;

	assert(pdest!=NULL && psrc!=NULL);

	// 处理区域重叠问题
	if(pdest > psrc && pdest < psrc + n){
		// 如果重叠了,则从后面开始复制
		for(i=n-1; i>=0; i--){
			pdest[i] = psrc[i];
		}
	}else{
		while(n-->0){
			*pdest++ = *psrc++;		
		}
	}

	return dest;
}

int 
main()
{
	char arr[] = "helloworld";
	char *src, *dst;

	// 有重叠的两个区域
	src = arr;
	dst = arr + 4;

	printf("%s\n", (char *)memcpy(dst, src, 6));
	return 0;
}

// 写函数的时候要注意
// 1. 参数处理 
//    参数是否正确(不能为NULL)(assert)
//    不能修改的加上const
// 2. 具体问题的考虑
//    此问题中,dest和src有重叠的时候该怎么办。所以要考虑到所有情况。


参考: http://bbs.csdn.net/topics/210050580

            http://blog.csdn.net/gengshenghong/article/details/5634776

你可能感兴趣的:(数据结构与算法)