当前位置:   article > 正文

【C语言】内存函数详解

【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模拟实现

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

完整代码:

  1. #define _CRT_SECURE_NO_WARNINGS 1
  2. #include <stdio.h>
  3. #include <assert.h>
  4. void* my_memmove(void* dest, const void* src, size_t num)
  5. {
  6. void* ret = dest;
  7. assert(dest && src);
  8. if (dest < src)
  9. {
  10. //正序
  11. while (num--)
  12. {
  13. *(char*)dest = *(char*)src;
  14. dest = (char*)dest + 1;
  15. src = (char*)src + 1;
  16. }
  17. }
  18. else
  19. {
  20. //反序
  21. while (num--)
  22. {
  23. *((char*)dest + num) = *((char*)src + num);
  24. }
  25. }
  26. return ret;
  27. }
  28. int main()
  29. {
  30. int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
  31. my_memmove(arr + 2, arr, 20);
  32. int i = 0;
  33. for (i = 0; i < 10; i++)
  34. {
  35. printf("%d ", arr[i]);
  36. }
  37. return 0;
  38. }

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、谢谢观看

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/330414
推荐阅读
相关标签
  

闽ICP备14008679号