【C语言】模拟实现memcpy、memmove、memset函数

本文介绍了C语言中用于内存操作的关键函数:memcpy、memmove、memset及memcmp。讲解了它们的原型、功能以及模拟实现,特别强调了memcpy和memmove在处理内存重叠时的区别,以及memset在填充内存块中的效率优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值