C语言内存操作函数的实现

>memcpy:

void *memcpy(void *dest,const void *source,size_t num);

(1)函数memcpy从source的位置开始向后复制num个字节的数据到dest的内存位置。

(2)这个函数在遇到'\0'的时候并不会停下来。

(3)如果source和dest有任何的重叠,复制的结果都是未定义的。

void *my_memcpy(void *dest, const void *str, int size)
{
	assert(dest);
	assert(str);
	assert(size > 0);
	while (size--){
		*(char *)dest = *(char *)str;
		(char *)dest = (char *)dest + 1;
		(char *)str = (char *)str + 1;
	}
	return dest;
}

适用于dest>source,如果dest<source就会内存从叠问题,从前往后拷贝时前一个会把后一个覆盖num个字节。这时就需要用到memmove。

>memmove:

void *memmove (void *dest,const char *str,int size);

(1)和memmove的差别就是memmove函数处理的源内存块的目标内存块是可以重叠的。

(2)如果源空间和目标空间出现重叠,就得使用memmove函数处理。

void *my_memmove(void *dest, const void *str, int size)
{
	assert(dest);
	assert(str);
	assert(size > 0);
	if (dest <=str || (char *)dest >= (char *)str + size){
		while (size--){
			*(char *)dest = *(char *)str;
			(char *)dest = (char *)dest + 1;
			(char *)str = (char *)str + 1;
		}

	}
	else {
		dest = (char *)dest + size - 1;   //指针指向数组结尾
		str = (char *)str + size - 1;     
		while (size--){
			*(char *)dest = *(char *)str;
			(char *)dest = (char *)dest- 1;
			(char *)str = (char *)str- 1;
		}
	}
	return dest;
}
>memcmp:
int memcmp(const void *str1,const void *str2,size_t num);

比较从str1和str2指针开始的num个字节。

int my_memcmp(const void *str1, const void *str2, int size)
{
	assert(str1);
	assert(str2);
	assert(size>0);
	int ret = 0;
	while (size&&(!(ret=*(unsigned char *)str1-*(unsigned char *)str2))&&(*(char *)str1)){
		(char *)str1 = (char *)str1+1;
		(char *)str2 = (char *)str2+1;
		size--;
	}
	if (ret > 0)
		printf("str1>str2\n");
	else if(ret<0)
		printf("str1<str2\n");
	return ret;
}

>memchr:

void *memchr(const void *dest,int c,size_t count);

从dest区域所指内存的前count开始查找字符c。

void *my_memchr(const void *dest, int c, int size)
{
	assert(dest);
	assert(size>0);
	while (size&&*(char *)dest){
		if (*(char *)dest ==(char)c)
		     return (char *)dest;
	      dest = (char *)dest + 1;
	      size--;
	}
	return 0;
}


猜你喜欢

转载自blog.csdn.net/qq_41889292/article/details/80426460