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

目录

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 );

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

相关推荐

  1. [C语言]memcpy memmove模拟实现 memcmp memset

    2024-03-23 08:54:02       44 阅读
  2. 红黑树C语言简单实现与代码

    2024-03-23 08:54:02       58 阅读
  3. C++ 判断语句深入

    2024-03-23 08:54:02       25 阅读
  4. C++】STL中List详细实现

    2024-03-23 08:54:02       38 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-23 08:54:02       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-23 08:54:02       106 阅读
  3. 在Django里面运行非项目文件

    2024-03-23 08:54:02       87 阅读
  4. Python语言-面向对象

    2024-03-23 08:54:02       96 阅读

热门阅读

  1. 查找DNS解析记录

    2024-03-23 08:54:02       40 阅读
  2. Unity 获取鼠标滚轮信息的一些方法

    2024-03-23 08:54:02       44 阅读
  3. 复习Day1

    2024-03-23 08:54:02       37 阅读
  4. HBase Shell的应用案例

    2024-03-23 08:54:02       31 阅读
  5. 【B树 B+树——数据结构】

    2024-03-23 08:54:02       46 阅读