内存函数memcpy和memmove

server/2025/1/12 13:33:32/

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.ppmy.cn/server/105252.html

相关文章

Go 内存分配:结构体中的优化技巧

在使用Golang进行内存分配时&#xff0c;我们需要遵循一系列规则。在深入了解这些规则之前&#xff0c;我们需要先了解变量的对齐方式。 Golang的unsafe包中有一个函数Alignof&#xff0c;签名如下&#xff1a; func Alignof(x ArbitraryType) uintptr对于任何类型为v的变量x…

python爬虫源码:selenium+browsermobproxy实现浏览器请求抓取

前言 如上篇博客所述&#xff1a;为了抓取所有&#xff0c;通过浏览器F12可以看到的资源&#xff08;静态资源和接口调用&#xff09;&#xff0c;我使用了seleniumbrowsermobproxy的方案来处理。 这是两个模块的安装方案&#xff0c;没有看过的朋友可以去了解一下&#xff1a;…

Docker 启动单机版ES

官方安装教程&#xff1a;https://www.elastic.co/guide/en/elasticsearch/reference/8.14/docker.html#_linux 调整vm.max_map_count CentOS 7.9中&#xff0c;默认的vm.max_map_count值是65536。这个值表示一个进程可以拥有的虚拟内存区域&#xff08;VMA, Virtual Memory …

基于单片机的仿生水母水下机器人设计

摘 要 &#xff1a; 文章对水母喷水推进的运动方式进行建模 &#xff0c; 设计了仿生水母的机械结构 &#xff0c; 并重点设计了基于单片机的控制系统&#xff0c; 完成了基于单片机的仿生水母水下机器人的设计 &#xff0c; 具有一定的应用价值 。 关键词 &#xff1a; 单片机…

Git 远程操作

1. 理解分布式版本控制系统 我们所说的⼯作区&#xff0c;暂存区&#xff0c;版本库等&#xff0c;都是在本地&#xff01;也就是在笔记本或计算机上。⽽我们的 Git 其实是分布式版本控制系统.可以简单理解为&#xff0c;我们每个⼈的电脑上都是⼀个完整的版本库&#xff0c;这…

Swift中的数据守护者:Core Data全解析

标题&#xff1a;Swift中的数据守护者&#xff1a;Core Data全解析 在Swift语言的iOS开发中&#xff0c;数据持久化是一个核心议题&#xff0c;而Core Data则是Apple提供的一个强大而灵活的解决方案。它不仅可以处理本地数据存储&#xff0c;还可以与远程数据源同步。本文将深…

Leetcode-day31-01背包问题

46. 携带研究材料 1.dp数组代表的是什么&#xff1f; 这里的dp数组是一个二维数组&#xff0c;dp[i][j]是从前i个物品中任选放入容量j内的最大价值。 2.递推公式。 不放物品i&#xff1a;由dp[i - 1][j]推出&#xff0c;即背包容量为j&#xff0c;里面不放物品i的最大价值&am…

RocketMQ 如何保证消息不丢失?

RocketMQ 的消息想要确保不丢失&#xff0c;需要生产者、消费者以及 Broker 的共同努力&#xff0c;缺一不可。 生产者&#xff08;Producer&#xff09; 1、发送方式&#xff1a;选择同步发送 同步发送&#xff1a;发送消息后&#xff0c;需要阻塞等待 Broker 确认收到消息…