我是靠谱客的博主 香蕉苗条,最近开发中收集的这篇文章主要介绍【C语言】模拟实现memcpy、memmove、memset函数,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

memcpy原型

void* (void* dest,const void* src,size_t len)
为什么是void呢?,因为memcpy支持任何匀速类型的拷贝,所以给成void类型,然后在进行强制类型转化即可达到任意类型的拷贝。
这同样也是strcpy和memcpy的一个差别,这里mempy是对内存进行操作的所以无论你是什么类型,都可以对其进行操作。

memcpy模拟实现

void *my_memcpy(void *det, const void *src, int num)
 
{
 
char *p1 = (char *)det;
 
char *p2 = (char *)src;
 
char *ret = p1;
 
while (num)
 
{
 
*p1 = *p2;
 
p1++;
 
p2++;
 
}
 
return ret;
 
}

memmove函数原型

void* memmove(void *dst, const void *src, size_t count)

memcpy函数没有处理内存重叠的情况,所以引出了memmove函数来处理这个情况

memmove函数模拟实现

void* m_memmove(void* dest, const void* src, size_t len)
{
	assert(dest);
	assert(src);
	char* d = (char*)dest;
	char* s = (char*)src;
	char* res = d;
	if (d > s && d < s + len)
	{
		d = d + len;
		s = s + len;
		while (len--)
		{
			*d-- = *s--;
		}
	}
	else
	{
		while (*d++ = *s++)
		{
			;
		}
	}
	return res;
}

memset函数原型

void *memset(void *s, int ch, size_t n);
功能:将s中前n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s 。

突出优点:在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法

void* m_memset(void* src, int n, size_t len)
{
	int* s = (int*)src;
	int* temp = s;
	while (len--)
	{
		*s++ = n;
	}
	return temp;
}

memcmp函数原型

int memcmp(void* dest, const void* src,size_t len)

memcmp函数实现

int m_memcmp(void* dest, const void* src,size_t len)
{
	assert(dest);
	assert(src);
	char* d = (char*)dest;
	char* s = (char*)src;
	while (len--)
	{
		if (*d == *s)
		{
			d++;
			s++;
		}
		else
		{
			if (*d > *s)
				return 1;
			else
				return -1;
		}
	}
	
	return 0;
}

最后

以上就是香蕉苗条为你收集整理的【C语言】模拟实现memcpy、memmove、memset函数的全部内容,希望文章能够帮你解决【C语言】模拟实现memcpy、memmove、memset函数所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(64)

评论列表共有 0 条评论

立即
投稿
返回
顶部