C语言内存函数详解

文章目录

  • 前言
  • 一、memcpy函数(内存拷贝函数)
  • 二、memmove重叠拷贝函数
  • 三.memset内存设置函数
  • 四.memcmp内存比较函数
  • 总结

前言

我们之前按学习了C语言标准库中提供了一系列的字符和字符串库函数,接下来我们就学习一下关于内存相关的一些函数。


一.memcpy函数(内存拷贝函数)

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

1.1使用

destination这个是目地,source这个是源头,size_t num这个是内存大小的字节单位

cpp 复制代码
int main()
{
	int arr1[] = { 1,2,3,4,5 };
	int arr2[] = { 0 };
	memcpy(arr2, arr1, 20);
	return 0;
}

负责拷贝两块独立空间中的数据

如果你想要重叠拷贝的话,则请使用memmove

1.2模拟实现

cpp 复制代码
void* my_memcpy(void* dest, const void* src, size_t num)
{
	assert(dest && src);
	void* ret = dest;
	while (num--)
	{
		*(char*)dest = *(char*)src;
		dest=*(char*)dest + 1;
		src=*(char*)src + 1;
	}

	return ret;

}

代码写完很多人会有疑问,为什么要这样子去做?char为什么要这样子的指针去强制类型转换,是因为这个代码,它可以用于任意类型的内存数据所以说他其实并不知道你传进来的数据是哪种类型的,我们之前的例子是一个整形,你不能用一个整形去做,他万一是长整形短整型怎么办呢?所以我们要想到一个能解决所有类型的方法,那就是把它强制转换成字符新的指针,因为一个字符类型,他就等于一个字节,所以说你每+1就等于一个字节,每不管哪个类型都可以把它变成一个字节一个字节的走。

把这个数据类型,都可以分成这样,所以就解决了。

二.memmove重叠拷贝函数

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

和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。如果源空间和目标空间出现重叠,就得使用memmove函数处理。

2.1使用

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

2.2模拟实现

这个的模拟实现就比较难了,有时候需要从前往后处理,有时候又需要从后往前处理,所以我们必须来画一个图来思考

当dest的地址小于src的地址,我们是从前往后拷还是从后往前拷呢?我们可以从图像得出,如果我们从后往前拷的话就会覆盖还未考虑的数据,所以只能从前往后拷。

同理,当dest的地址大于src的时候,只能从后往前拷

cpp 复制代码
void* my_memmove(void* dest, const void* src, size_t num)
{
	//assert(dest && src);
	//从前向后拷贝
	void* ret = dest;
	if (dest < src)
	{
		
		while (num--)
		{
			*(char*)src = *(char*)dest;
			dest = *(char*)dest + 1;
			src=*(char*)src + 1;
		}

	}
	//从后向前拷贝
	else
	{

		while (num--)
		{
			//先找到最后一个数据,通过num--不断向前拷贝
			*((char*)dest+num) = *((char*)src+num);
		
		}


	}
	return ret;



}

三.memset内存设置函数

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

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

使用

cpp 复制代码
int main()
{
	char str[] = "hello world";
	memset(str, 'x', 6);
	printf(str);
	return 0;
}

四.memcmp内存比较函数

int memcmp ( const void * ptr1, const void * ptr2, size_t num );

是按字节数去比较,如果在之前就比完了,后面就不需要再比了,如果源头大于目的返回一个小于0的数

cpp 复制代码
int main()
{
	int arr1[] = { 1,2,3,4 };
	int arr2[] = { 1,2,3,5 };
	int ret = memcmp(arr1, arr2, 15);
	printf("%d", ret);



	return 0;
}

返回-1


总结

熟练的掌握这一系列的库函数,可以在做某些题目上省去大量的时间,如果你不做题目,掌握这些函数,也可以增加你阅读别人函数的经验看得懂别人的代码

相关推荐
Java手札13 分钟前
Windows下Golang与Nuxt项目宝塔部署指南
开发语言·windows·golang
小生凡一15 分钟前
腾讯二面:TCC分布式事务 | 图解TCC|用Go语言实现一个TCC
开发语言·分布式·golang
minji...20 分钟前
C语言 函数递归
c语言·开发语言·算法
云上空40 分钟前
C#初级知识总结
开发语言·c#
CHTXRT1 小时前
2025第十六届蓝桥杯大赛(软件赛)网络安全赛 Writeup
c语言·网络·web安全·网络安全·蓝桥杯·wireshark
钢铁男儿1 小时前
C# 深入理解类:面向对象编程的核心数据结构
开发语言·数据结构·c#
Doker 多克1 小时前
Python-Django系列—部件
开发语言·python
江沉晚呤时2 小时前
深入解析 ASP.NET Core 中的 ResourceFilter
开发语言·c#·.net·lucene
huangyuchi.2 小时前
【C++11】Lambda表达式
开发语言·c++·笔记·c++11·lambda·lambda表达式·捕捉列表
XiaoyuEr_66882 小时前
如何创建一个C#项目(基于VS2022版)
开发语言·c#