内存函数(C语言)

今天来了解一下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;
}

 

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值