【C语言】内存函数详解

目录

目录

1、memcpy函数

1.1、memcpy函数的使用

1.2、memcpy模拟实现

1.21、代码详解

2、memmove函数

2.1、memmove函数的使用

2.2、memmove模拟实现

2.21、代码详解

3、memset函数的使用

3.1、注意事项

4、memcmp函数的使用

5、谢谢观看
 


正文

使用内存函数时需要包含的头文件为 <string.h>

1、memcpy函数

1.1、memcpy函数的使用

memcpy与strcpy 是有相同点的,我们已知strcpy函数是用来对字符串进行拷贝的,且只能进行字符串的拷贝。

strcpy—— string  字符串,copy 拷贝

memcpy—— memory  代表内存  ,copy 拷贝

顾名思义,memcpy函数是针对内存块的拷贝。

参数:destination——目标空间,source——源数组,num——进行拷贝的字节个数

所以,memcpy的函数功能为:从source的位置开始向后复制num个字节的数据拷贝到destination指向的内存位置。

memcpy函数可以拷贝内存中任意类型的数据,那么它可以代替strcpy函数进行字符串的拷贝吗?

memcpy函数可以拷贝字符串,但它在遇到'\0'时不会停下来。而strcpy函数会将源字符串中的'\0'拷贝到目标空间后结束。

使用前提:destination数组与source数组不能有内存的重叠。

如上图,在拷贝时若将对应字节都拷贝完成之后,arr2中剩余的空间补0 。 

1.2、memcpy模拟实现

注:先附完整代码,然后进行代码详解。

函数代码:

1.21、代码详解 

函数参数部分详解:

强制转换部分详解: 

2、memmove函数

2.1、memmove函数的使用

 

 上述内容讲到,memcpy的使用前提是destination数组与source数组不能有内存的重叠。而有内存重叠的数据进行拷贝就要用到memmove。

简单来讲,memcpy是将数组1的num个字节拷贝到数组2中,是两个不同的空间进行拷贝;而memmove是将数组1的num个字节拷贝到数组1的其他位置中,覆盖掉了原本的数据。

memmove函数的功能:将 从source的位置开始向后复制num个字节的数据拷贝到destination指向的内存位置。其中,source可以与destination相等,即有重叠。

使用memmove函数:

所以是将12345,拷贝到34567的空间中,覆盖了原来的数据。

打印结果为1 2 1 2 3 4 5 8 9 10 

2.2、memmove模拟实现

注:先附完整代码,然后进行代码详解。

完整代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <assert.h>
void* my_memmove(void* dest, const void* src, size_t num)
{
	void* ret = dest;
	assert(dest && src);

	if (dest < src)
	{ 
		//正序
		while (num--)
		{
			*(char*)dest = *(char*)src;
			dest = (char*)dest + 1;
			src = (char*)src + 1;
		}
	}
	else
	{
		//反序
		while (num--)
		{
			*((char*)dest + num) = *((char*)src + num);
		}
	}
	return ret;
}
int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	my_memmove(arr + 2, arr, 20);
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

2.21、代码详解

思路: 

逐图讲解:

图1: dest为高地址,在src前面,在对src、dest进行交换时,如果将src从  前-->后 的顺序(正序)进行交换时 ,换到3时源数据被覆盖,需要将src从  后-->前  的顺序(反序)进行交换。

注:进行交换时,src、dest的正/反序 交换的顺序一样,均为正序或反序。

图2: dest为低地址,在src后面,在对src、dest进行交换时,将src从  前-->后 的顺序(正序)进行交换。 反序交换会被覆盖。

图3:src、dest的空间没有重叠。既可以正序交换,有可以反序交换。

则可以得到以下结论:

故,我们现在在进行拷贝时有两种方法:

  1. 让重叠部分使用反序,则以src处为分界点,之前为正序,之后为反序,分为两部分
  2. 让重叠部分使用正序,则以src与src终点为分界点,分为三部分 

上面的代码使用的是方法1(分为两部分) 。

3、memset函数的使用

ptr : 指向要被设置的内存块

value : 要设置的值

num : 设置为value的字节个数

功能:将ptr指向的空间中num个字节的每个字节设置为value值

函数使用:

说明:将字符串str中的6个字节设置为‘x’

3.1、注意事项

memset函数在对整型数组进行设置时,一定要注意:

memset函数是以字节为单位进行设置的,做不到以元素为单位来设置。

举例说明:

想要将数组arr中的5个元素均设置为1,写下了以下代码

但打印出来的数组内容非全1 

所以在把memset函数对整型数组使用时,要慎重!!!

 4、memcmp函数的使用

memcmp函数是针对内存块的比较。 

功能:比较从ptr1和ptr2指针指向的位置开始,向后的num个字节。

返回值:

 若ptr1  >  ptr2    ,返回>0的数

 若ptr1  =  ptr2    ,返回=0的数

 若ptr1  <  ptr2    ,返回<0的数

5、谢谢观看

篇幅有点长,非常感谢能看到最后。 

  • 45
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值