[C语言]memcpy memmove的模拟实现 memcmp memset解析

本文详细解析了memcpy、memmove、memcmp和memset这四个C语言内存操作函数的工作原理,并提供了模拟实现代码示例,帮助理解整数数组的复制、移动和比较操作。
摘要由CSDN通过智能技术生成

目录

memcpy

解析

模拟实现

memmove

解析

模拟实现

memcmp

memset

我们知道在学字符串的时候有strcpy strcmp 等等的库函数,但这些都只能进行字符串的操作,如果我们要对一个整数的数组进行比较和复制呢?我们可以采用什么方法呢?以下就是对这些函数的解析以及对memcpy和memmove的模拟实现

memcpy

解析

memcpy函数就是对内存进行赋值,memcpy复制的是字节大小具体类型如下

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

需要传递需要复制的destination 复制的source以及赋值多少字节的num

返回的是destination的一个空指针,如果要模拟实现的话应该怎么样呢?我们来试一下

模拟实现

#include <stdio.h>
void* my_memcpy(void* mem1,const void* mem2, size_t n)
{
	void* ret = mem1;
	while (n--)
	{
		*((char*)mem1) = *((char*)mem2);
		mem1 = ((char*) mem1)++;
		mem2 = ((char*)mem2)++;
	}
	return ret;
}
print(int* arr,int num)
{
	int i;
	for(i=0;i<num;i++)
	{
		printf("%d", arr[i]);
	}
}
void main()
{
	int a[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int b[20] = { 0 };
	my_memcpy(b, a, 20);
	print(b, 20);
}

memmove

解析

memmove函数就是将一个地址的内存移动到另外一个地址上,乍一看有点像是movecpy,但是其实两者是有区别的,如我需要复制一个数组为arr[10]={1,2,3,4,5,6,7,8,9,10},我们需要数组1~5的数字移动到它的第三个地址该怎么样呢,如果我们用strcpy(arr+2,arr,20)我们会发现结果变成了{1,2,1,2,1,2,1,8,9,10}好像与我们的预期并不相符合。因为我们改变了arr的第三个地址我们再调入第三个地址的时候arr的第三个地址变为了1,而第四个地址变成了2,因此会不断地循环1,2,1,2.而运用memmove的方式就不会出现这种情况,是怎么回事呢?我们来看看下面的代码是怎么实现的

模拟实现

#include <stdio.h>
#include<assert.h>
void* my_memmove(void* dest, void* src, size_t num)
{
	assert(dest && src);
	void* ret = dest;
	if (dest > src)
	{
		while (num--)
		{
			*(((char*)dest) + num) = *(((char*)src+num)); //从后面开始传址
		}
   }
	else
	{
		while (num--)
		{
			//从前面开始传址
			*((char*)dest) = *((char*)src);
			dest = ((char*)dest) + 1;
			src = ((char*)src) + 1;
		}
	}
	return ret;
}
print(int* arr, int num)
{
	int i;
	for (i = 0; i < num; i++)
	{
		printf("%d", arr[i]);
	}
}

void main()
{
	int a[10] = { 1,2,3,4,5,6,7,8,9,10 };
	my_memmove(a + 2, a, 5);
	print(a, 10);
}

memcmp

memcmp的输入参数为int memcmp ( const void * ptr1, const void * ptr2, size_t num );

我们可以看到他为比较两个地址内存中存放的值大小,如果ptr1>ptr2就返回一个大于0的数

小于就返回一个小于0的数,相等就等于0

memset

memset的参数如下

void * memset ( void * ptr, int value, size_t num );

其中第一个是需要被设置的地址,第二个参数是地址需要被设置的值,第三个参数为地址往后有多少个字节需要被设置

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值