当前位置: 首页 > news >正文

内存函数memcpy和memmove

memcpy 内存拷贝

函数原型:void * memcpy(void * destination , void * source, size_t num);

  1. 函数mencpy从source的位置开始向后复制num个字符的数据到destinaton的内存位置
  2. 这个函数遇到’\0’并不会停下来
  3. 如果source和destination有任何的重叠,复制的结果都是未定义的
  4. 用于两块独立的内存之间的拷贝
int main()
{int arr1[] = {1, 2, 3, 4, 5, 6, 7};int arr2[10] = {0};memcpy(arr2, arr1, 28);   //最后一个参数的单位是byte
}

模拟实现memcpy函数,如下:


void* my_memcpy(void* dest, const void* src, size_t num)
{assert(dest && src);void* p = dest;while (num--){*(char*)dest = *(char*)src;dest =(char *)dest + 1;src = (char*)src + 1;}return p;
}

memmove 内存移动

函数原型:void * memmove ( void * destination, const void * source, size_t num );

  1. Copies the values of num bytes from the location pointed by source to the memory block pointed by destination. Copying takes place as if an intermediate buffer were used, allowing the destination and source to overlap.
  2. 用于同一块内存的覆盖拷贝
int main ()
{char str[] = "memmove can be very useful......";memmove (str+20,str+15,11);  //用于同一块内存的覆盖拷贝puts (str);return 0;
}

输出

memmove can be very very useful.

memcmp 比较内存中两个数据的大小

函数原型:int memcmp(const void *ptr1, const void * ptr2, size_t num);

  1. 比较从ptr1和ptr2指针开始的num个字节
  2. 返回值如下:
return valueindicates
< 0the first byte that does not match in both memory blocks has a lower value in ptr1 than in ptr2 (if evaluated as unsigned char values)
0the contents of both memory blocks are equal
> 0the first byte that does not match in both memory blocks has a greater value in ptr1 than in ptr2 (if evaluated as unsigned char values)
int main()
{int arr1[] = {1, 2, 3, 4, 5};int arr2[] = {1, 3, 2};int ret = memcmp(arr1, arr2, 12);   //比较是按一个字节一个字节的比较printf("%d\n", ret);
}

输出

-1

memset 内存设置指定的值

函数原型:void * memset(void *ptr, int value, size_t num);

  1. Sets the first num bytes of the block of memory pointed by ptr to the specified value (interpreted as an unsigned char).
  2. 按字节设置。

用法一:设置字符的值

int main ()
{char str[] = "almost every programmer should know memset!";memset (str,'-',6);puts (str);return 0;
}

输出

------ every programmer should know memset!

用法二,设置int型的值

int main()
{int arr[] = { 1, 2, 3, 4, 5 };int i = 0;memset(arr, 1, 20);for (i = 0; i < 5; i++){printf("%d ", arr[i]);}
}

输出

16843009
16843009
16843009
16843009
16843009

由以上结果分析,由于memset是按字节一个一个的来设置value,所以int型的变量,就是被设置为:0x01010101 即为16843009;

随意meset对int型的通常用法是清零:memset(arr, 0 ,20)


http://www.mrgr.cn/news/12346.html

相关文章:

  • 基于SSM的垃圾分类管理系统的设计与实现 (含源码+sql+视频导入教程+论文)
  • JSP 常用指令精简介绍
  • C++基础知识(三)
  • 第一次运行Neo4J
  • 力扣455-分发饼干(java题解)
  • 深度学习100问8-什么是PTB语料库
  • 标准UEFI Shell命令
  • 腾讯开源突破技术:V-Express引领人像照片视频化新潮流
  • 网络优化4|网络流问题|路径规划问题|车辆路径问题
  • 汽车功能安全--TC3xx LBIST触发时机讨论
  • 网络编程(学习)2024.8.27
  • 模拟实现string
  • 解锁2024音乐新玩法!3款剪辑神器在手,专属BGM创作从此不再难!
  • 【IC设计】跨时钟异步处理系列——单比特跨时钟
  • 如何使用Hive构建高校考试分析系统:大数据技术在教育领域的应用
  • 核心数据加密的实现方式
  • 心觉:赚钱是修行最快的一种方式
  • BAT32G137国产项目通用第四节:FreeRTOS MCU负载率
  • 算法刷题日志
  • CentOS7 多硬盘合成卷组并创建LVM,挂载到同一目录下