【C语言】内存操作函数的模拟和使用

大家好!我是

内存操作函数头文件为<memory.h> or <string.h>

1、memcpy

原型为:void *memcpy( void *dest, const void *src, size_t count )

作用为:把src指向内容拷贝到src指向的内容中

使用格式:memcpy(目的地地址,源头地址,操作内存大小(字节))

我们试着模拟一下

#include"stdio.h"
#include"assert.h"

void* my_memcpy(void* dest, const void* src, size_t count)
{
    assert(dest && src);
	void* ret = dest;
	while (count--)
	{
		*(char*)dest = *(char*)src;
		dest = (char*)dest + 1;
		src = (char*)src + 1;
	}
	return ret;
}

int main()
{
	int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int arr2[5] = { 0 };
	my_memcpy(arr2, arr1, 20);
	int i = 0;
	for (i = 0; i < 5; i++)
	{
		printf("%d ", arr2[i]);
	}
	return 0;
}

我们发现arr1中的前4*5个字节被拷贝到arr2中。(一个整型4字节)

*注意:

1、memcpy遇到'\0'不会停下

因为memcpy根据根据操作内存大小来拷贝。

2、memcpy不能拷贝重叠内存

如果代码如下,则结果却不是我们想要的。这是因为memcpy在拷贝过程中将arr1[0]拷贝到arr1[2]处后再想把arr1[2]中的3拷贝到arr1[4]中时发现arr1[2]已经被改为1了。

2、memmove

原型为:void *memmove( void *dest, const void *src, size_t count )

作用为:内存拷贝(可拷贝重叠内存)

使用格式:memmove(目的地地址,源头地址,操作内存大小(字节))

个人认为是memcpy的升级版哈哈

我们试着模拟一下

#include"stdio.h"
#include"assert.h"

void* my_memmove(void* dest, const void* src, size_t count)
{
	assert(dest && src);
	void* ret = dest;
	if (dest < src)
	{
		//从前往后拷贝
		while (count--)
		{
			*(char*)dest = *(char*)src;
			dest = (char*)dest + 1;
			src = (char*)src + 1;
		}
	}
	else
	{
		//从后往前拷贝
		while (count--)
		{
			*((char*)dest + count) = *((char*)src + count);
		}
	}
	return ret;
}

int main()
{
	int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
	my_memmove(arr1 + 2, arr1, 20);
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr1[i]);
	}
	return 0;
}

 

结果如上图,我们发现 memcpy实现不了的拷贝重叠内存,memmove可以实现。

3、memcmp

原型为:int memcmp( const void *buf1, const void *buf2, size_t count );

作用为:内存比较

使用格式:memcpy(地址1,地址2,比较的内存大小 (字节))

我们试着使用用一下

#include"stdio.h"
#include"string.h"

int main()
{
	char buffer1[] = "abcde";
	char buffer2[] = "abce";
	int ret = memcmp(buffer1, buffer2, 4);
	printf("%d", ret);
	return 0;
}

 

返回值:

当两个参数进行逐字节比较时,如果遇到的第一对不同内存时,若参数1中的数据大于参数2中的数据,则返回大于0的数,反之返回小于0的数,若在比较字节内全部相同返回0。

 

4、memset

原型为:void *memset( void *dest, int c, size_t count )

作用为:内存设置

使用格式:memset(目的地地址,想改成的数字,设置多少字节)

我们试着使用用一下就能知道作用了

 谢谢大家观看,写得不好还请指出!

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值