当前位置:   article > 正文

C语言常用内存函数(超详细版)_c语言内存函数

c语言内存函数

目录

memcpy函数

使用实例

模拟实现

memmove函数

使用实例

模拟实现

memcmp函数

 使用实例

模拟实现

memset函数

使用实例



字符(串)函数可以专门对字符或字符串操作,同时,若要对其他类型数据进行这些操作,就可以借助内存函数直接对内存操作,接下来介绍的几个内存函数就是极其常用的。


memcpy函数

  • void* memcpy( void* destination , const void* source, size_t num);
  • 从source的位置开始拷贝numge个字节的数据到destination的内存位置;
  • 所有类型的数据都可以拷贝,所以返回值是void* 类型;
  • 遇到 ' \0 ' 的时候不会停下来;
  • 对自己内容的一部分拷贝给自己是无效的;

使用实例:

  1. #include<stdio.h>
  2. #include<string.h>
  3. int main()
  4. {
  5. int source[10] = { 1,2,3,4,5,6,7,8,9,10 };
  6. int destination[5] = { 0 };
  7. memcpy(destination, source, 5 * sizeof(int));
  8. return 0;
  9. }

 

模拟实现:

关键思路:

既然返回类型和形参类型都是void* ,那对于不同的类型数据怎么保证全部拷贝呢?

可以强转为char*型,这样就可以不放过每个字节对应的数据了;

  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<assert.h>
  4. void* my_memcpy(void* destination, const void* source, size_t num)
  5. {
  6. assert(destination && source);
  7. void* start = destination;
  8. while (num--)
  9. {
  10. *((char*)destination)++ = *((char*)source)++;
  11. }
  12. //warning C4716 : “my_memcpy”: 必须返回一个值
  13. return start;
  14. }
  15. int main()
  16. {
  17. int source[10] = { 1,2,3,4,5,6,7,8,9,10 };
  18. int destination[5] = { 0 };
  19. my_memcpy(destination, source, 5 * sizeof(int));
  20. for (int i = 0; i < 5; i++)
  21. {
  22. printf("%d ", destination[i]);
  23. }
  24. return 0;
  25. }

 注意点:

 


memmove函数

  • void * memmove ( void * destination, const void * source, size_t num );
  • memcpy 的差别就是 memmove 函数处理的源内存块和目标内存块是可以重叠的;
  • 如果源空间和目标空间出现重叠,就得使用 memmove 函数处理。

使用实例:

 对于上述第二点:

模拟实现:

关于该函数的模拟实现也就有的研究了。

比如:对于数组arr自身要实现移动:必须考虑数据覆盖问题

如果要移动的数据的起始位置在目标位置之前:就应该依次先移动最后面的数据(从后往前);

如果要移动的数据的起始位置在目标位置之后:就应该依次先移动前面的数据(从前往后);

 

 秘诀:其实就是从它们相交的位置开始移动

  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<assert.h>
  4. void* my_memmove(void* destination, const void* source, size_t num)
  5. {
  6. assert(destination && source);
  7. void* ret = destination;
  8. //前 -> 后
  9. //dest < src
  10. if (destination < source)
  11. {
  12. while (num--)
  13. {
  14. *(char*)destination = *(char*)source;
  15. destination = (char*)destination + 1;
  16. source = (char*)source + 1;
  17. }
  18. }
  19. //后 -> 前
  20. //dest > src
  21. else
  22. {
  23. while (num--)
  24. {
  25. *((char*)destination + num) = *((char*)source + num);
  26. }
  27. }
  28. return ret;
  29. }
  30. int main()
  31. {
  32. int source[10] = { 1,2,3,4,5,6,7,8,9,10 };
  33. my_memmove(source, source + 5, 5 * sizeof(int));
  34. return 0;
  35. }


memcmp函数

  • int memcmp ( const void * ptr1, const void * ptr2, size_t num );
  • 比较ptr1和ptr2各自后面num个字节的数据是否相同;
  • 先遇到谁的小谁的就小;
  • 特点:可以作用于任何类型的数据;
  • 返回值:
  •  

 使用实例:

  1. #include<stdio.h>
  2. #include<string.h>
  3. int main()
  4. {
  5. int arr1[5] = { 1,2,3,4,5 };
  6. int arr2[5] = { 1,2,3,3,5 };
  7. int ret = memcmp(arr1, arr2, 5 * sizeof(int));
  8. printf("%d\n", ret);
  9. return 0;
  10. }

模拟实现:

  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<assert.h>
  4. int my_memcmp(const void* ptr1, const void* ptr2, size_t num)
  5. {
  6. assert(ptr1 && ptr2);
  7. int ret = 0;
  8. while (num--)
  9. {
  10. ret = *((char*)ptr1) - *((char*)ptr2);
  11. ptr1 = (char*)ptr1 + 1;
  12. ptr2 = (char*)ptr2 + 1;
  13. if (ret != 0)
  14. {
  15. return ret;
  16. }
  17. }
  18. return 0;
  19. }
  20. int main()
  21. {
  22. int arr1[5] = { 1,2,3,4,5 };
  23. int arr2[5] = { 1,2,3,3,5 };
  24. int ret = my_memcmp(arr1, arr2, 5 * sizeof(int));
  25. printf("%d\n", ret);
  26. return 0;
  27. }


memset函数

  • Sets buffers to a specified character.
  • void *memset( void *dest, int value, size_t count );
  • Return Value :memset returns the value of dest.

使用实例: 

  1. #include<stdio.h>
  2. #include<string.h>
  3. int main()
  4. {
  5. char arr[20] = { "hello world" };
  6. memset(arr + 6, 'x', 6 * sizeof(char));
  7. return 0;
  8. }

 

 注意:

memset函数的赋值是按照字节为单位的(见下图4),赋值1,实则是在内存中全部放了0x010101010101....... 这个数刚好是10进制的16843009

因此:该函数不能对整形数组赋除 0 和 -1 之外的数;

 

 

 

 

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

闽ICP备14008679号