C语言内存函数

大家好哇,我又来啦。今天的内容是关于内存的函数。

加油!!!!!!

在这里插入图片描述

一. memcpy的使用及模拟(内存拷贝)

memcpy的使用

mem即memory----英语中的记忆,这里是内存
memcpy是将原数据(source)拷贝到目标空间(destination)中去。
目标空间必须可修改,足够大
这个函数在遇到\0之前并不会停下来

在这里插入图片描述

int arr1[] = { 1,2,3,4,5,6,7,8,9,90 };
int arr2[90] = { 0 };
memcpy(arr2, arr1 + 3, 12);//注意注意,是字节的个数,想复制3个,即3*4=12个字节

在这里插入图片描述

memcpy的模拟

注意点:void*的指针不能直接进行运算,必须强制类型转换

void* my_memcpy(void* dest, const void* src, size_t num)
{
	int i = num;
	for (i = 0; i < num; i++)
	{
		*(char*)dest = *(char*)src;
		dest = (char*)dest + 1;
		src = (char*)src + 1;

		//在for循环里
		//1. *(int*)dest = *(int*)src;
		//*(int*)dest = *(int*)src;//万一是17个字节,前4个整型之后,最后一个字节怎么办
		//在此,我们将所有类型的数据切开,一个一个的字节
		// 
		// 2.(char*)dest++;
		//   (char*)src++;
		//在此不能使用(char*)dest++;(char*)src++;
		//强制类型转换是临时的,在++的时候,dest已经不是char*
	}
}
int main()
{
	int arr1[] = { 1,2,3,4,5,6,7,8,9,90 };
	int arr2[90] = { 0 };
	my_memcpy(arr2, arr1 + 3, 12);
	return 0;
}

注意点:source和destination的空间最好不要重叠,如果source和destination有任何的重叠,复制的结果都是未定义的。(对于重叠的内存,交给memmove来处理)
C语言规定:memcpy只要能实现不重叠的拷贝即可,重叠的拷贝交给memmove。

自己拷贝自己的,放在自己的另一个位置。例如,将arr1的12345放在原来34567的位置上

  1. 但是是有意外的,你原本的3已经变成1了,那后面

在这里插入图片描述

二. memmove的使用及模拟(内存移动)

memmove的使用

  1. memmove的使用与memcpy非常相似。
  2. 使用memmove需要包含头文件:#include<stdio.h>
int main()
{
	int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
	int arr2[90] = { 0 };
	memmove(arr1 + 2, arr1, 20);
	return 0;
}

在这里插入图片描述

memmove的模拟

在这里插入图片描述
判断到底该如何拷贝:

  1. 如果两者没有重叠的部分,那就随便,从前往后,从后往前都行。
  2. 如果dest<src,则从前向后打印
  3. else,从后向前即可

在这里插入图片描述

void* my_memmove(void* dest, const void* src, size_t num)
{
	char* ret = dest;
	assert(dest && src);
	if (dest < src)
	{
		while (num--)
		{
			*((char*)dest) = *((char*)src);
			dest = (char*)dest + 1;
			src =(char*)src + 1;
		}
	}
	else
	{
		while (num--)//还没进入循环num就已经--了一次
		{
			*(((char*)dest) + num) = *(((char*)src) + num);
		}
	}
	return ret;
}
int main()
{
	int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
	int arr2[90] = { 0 };
	my_memmove(arr1 + 2, arr1, 20);
	for (int i = 0; i < 10; i++)
	{
		printf("%d ", arr1[i]);
	}
	return 0;
}

三. memset函数的使用(内存设置)

memset是用来设置内存的,将内存中的值 以字节为单位 设置成想要的内容

在这里插入图片描述

汉语翻译:

在这里插入图片描述

	char arr1[] = "hello song";
	memset(arr1 + 6,                'i',         4);
	    //被设置的起始位置      //想要设置为的值    //该值的字节数
	//打印结果是hello iiii
	int arr1[] = { 0 };
	memset(arr1, 1, 4);
	//结果错误

这是整型数组,一个元素的大小是4个字节。memset是以字节为单位来设置,所以是给整型的4个字节一个一个设置。从下图也可以看出,是将1的四个字节的数字均改成1,那就是16进制的0x010101,而不是我们想要的结果,将0改为1.
在这里插入图片描述
在这里插入图片描述

四.memcmp函数的使用(内存比较)

在这里插入图片描述

	int arr1[] = { 1,2,3,4,5, };
	int arr2[] = { 1,2,3,6,5 };
	memcmp(arr1, arr2, 13);
	//13字节就是3个整形元素+1个字节

在这里插入图片描述

先比较前12个字节,发现它们完全一样,继续比较后面的字节,4<6,所以arr1<arr2.所以返回的值<0。

  • 25
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值