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


总结

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

相关推荐
ChoSeitaku29 分钟前
链表循环及差集相关算法题|判断循环双链表是否对称|两循环单链表合并成循环链表|使双向循环链表有序|单循环链表改双向循环链表|两链表的差集(C)
c语言·算法·链表
娅娅梨31 分钟前
C++ 错题本--not found for architecture x86_64 问题
开发语言·c++
DdddJMs__13534 分钟前
C语言 | Leetcode C语言题解之第557题反转字符串中的单词III
c语言·leetcode·题解
汤米粥37 分钟前
小皮PHP连接数据库提示could not find driver
开发语言·php
冰淇淋烤布蕾39 分钟前
EasyExcel使用
java·开发语言·excel
拾荒的小海螺1 小时前
JAVA:探索 EasyExcel 的技术指南
java·开发语言
马剑威(威哥爱编程)1 小时前
哇喔!20种单例模式的实现与变异总结
java·开发语言·单例模式
娃娃丢没有坏心思1 小时前
C++20 概念与约束(2)—— 初识概念与约束
c语言·c++·现代c++
白-胖-子1 小时前
【蓝桥等考C++真题】蓝桥杯等级考试C++组第13级L13真题原题(含答案)-统计数字
开发语言·c++·算法·蓝桥杯·等考·13级
好睡凯1 小时前
c++写一个死锁并且自己解锁
开发语言·c++·算法