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


总结

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

相关推荐
程序员佳佳3 分钟前
文章标题:彻底抛弃OpenAI官方Key?实测GPT-5.2与Banana Pro(Gemini 3):这才是开发者的终极红利!
开发语言·人工智能·python·gpt·ai作画·api·midjourney
挖矿大亨4 分钟前
C++中左移运算符重载
开发语言·c++
CoderCodingNo6 分钟前
【GESP】C++五级真题(数论-素数、贪心思想考点) luogu-B4050 [GESP202409 五级] 挑战怪物
开发语言·c++·算法
Kiyra19 分钟前
LinkedHashMap 源码阅读
java·开发语言·网络·人工智能·安全·阿里云·云计算
小刘爱玩单片机24 分钟前
【stm32简单外设篇】- 三色LED
c语言·stm32·单片机·嵌入式硬件
沐知全栈开发26 分钟前
Python3 日期和时间处理详解
开发语言
老王熬夜敲代码30 分钟前
C++模版元编程2
开发语言·c++
2501_9167665437 分钟前
【Java】HashMap集合实现类
java·开发语言
hope_wisdom40 分钟前
C/C++数据结构之队列基础
c语言·数据结构·c++·队列·queue
海棠AI实验室40 分钟前
Python 学习路线图:从 0 到 1 的最短闭环
开发语言·python·学习