内存函数(C语言)

发布于:2022-10-21 ⋅ 阅读:(269) ⋅ 点赞:(0)

今天来了解一下C语言的内存函数。

那么C语言中的内存函数都有哪些呢?

memcpy,memmove,memcmp,memset.

问题来了?我们应当如何使用这些函数呢?

接下来看我娓娓道来:

memcpy:

首先我们关注它的函数参数:

 

 原理是这样

我们来实际使用一下

代码如下:

注意:记得调用库函数

#include<string.h>

#include<stdio.h>
#include<string.h>
int main()
{
	int arr[10] = { 1,2,3,4,5,6 };
	int arr2[10] = { 0 };
	memcpy(arr2, arr, 12);
	return 0;
}

 

 很轻易我们看到arr2数组由全为零变成前三个数发生改变。

接下来我们如何不利用库函数来完成我们自己的my_memcpy函数呢?

我们很容易想到进行数组交换。、

代码如下:

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

不出意外的话要出意外了。

我们现在想在一个数组上进行复制。

说干就干。

我们先预想一下结果 

代码

#include<stdio.h>
#include<string.h>
int main()
{
	int arr[10] = { 1,2,3,4,5,6 };
	int arr2[10] = { 0 };
	memcpy(arr+2, arr, 16);
	return 0;
}

 结果会是什么呢?

1 2 1 2 3 4 吗?

结果如下;

 为什么会出现这样的事情呢?

 

 

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

所以我们应当注意memcpy和memmove的使用原则:

  • memcpy和memmove都是是常用的内存块拷贝函数
  • memcpy不提供内存覆盖检测和处理,尝试对源目存在重叠的内存进行拷贝,其行为是不确定的,memcpy不保证源内存重叠区域在被覆盖之前被拷贝
  • 对源目存在重叠的内存拷贝的情形,应选用memmove,它提供了对应的检测和处理

2.memmove

memcpy和memmove是内存拷贝的两种不同情况;memcpy不适用于内存重叠的情况,而memmove可以适用。

my_memmove

void*  my_memmove(void* dest, void* sour, size_t n)
{
	void* ret = dest;
	assert(dest && sour);
	if (dest < sour)
	{
		while (n--)
		{
			*(char*)dest = *(char*)sour;
			dest = (char*)dest + 1;
			sour = (char*)sour + 1;
		}
	}
	else
	{
		while (n--)
		{
			*((char*)dest + n) = *((char*)sour + n);
		}
	}
	return ret;
}

3.memcmp

 memcmp和strcmp区别:

strcmp只能应用于字符串,而memcmp不仅可以应用于字符串还可以用于其他场景。

4.memset

 设置字符值的函数

int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int arr2[10] = { 0 };
	/*my_memcpy(arr+2, arr, 20);*/
	memset(arr, 3, 5);
    return 0;
}

 

 今天的内存函数到这里就到尾声了,希望小伙伴们点点关注和赞,有什么也可以一起讨论。

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到