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

C语言——内存函数

C语言内存函数

memcpy使用和模拟实现

  1. memcpy函数
    在这里插入图片描述
    2.功能:
  • memcpy是完成内存块拷贝的,不关注内存中存放的数据是啥
  • 函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置
  • 如果source和destination有任何的重叠,复制的结果都是未定义的
  • memcpy的使用需要包含<string.h>
  1. 使用:
    在这里插入图片描述

memcpy的模拟实现

代码实现:

#include<stdio.h>
#include<assert.h>
void* my_memcpy(void* dest, const void* src, size_t num)
{void* ret = dest;assert(dest && src);while (num--){*(char*)dest = *(char*)src;src = (char*)src + 1;dest = (char*)dest + 1;}return ret;
}
int main()
{int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };int arr2[20] = { 0 };my_memcpy(arr2, arr1, 40);return 0;
}

内存:
在这里插入图片描述

memmove使用和模拟实现

  1. memmove函数
    在这里插入图片描述
  2. 功能:
  • memmove函数也是完成内存块拷贝
  • 和memcpy的区别在于memmove函数处理的源内存块和目标内存块是可以重叠的
  • memmove的使用需要包含<string.h>
  1. 基本使用
  • 内存不重叠
    在这里插入图片描述
  • 内存重叠
    在这里插入图片描述

memmove的模拟实现

(1). 在模拟实现时,如图:
在这里插入图片描述
现在我们就得到两种方法:

  • 1:若目标内存块在第一块区域或第三块区域,从前向后拷贝;在第二块区域,从后向前拷贝。
  • 2:若目标内存块在第一块区域,从前向后拷贝;在第二块区域或第三块区域,从后向前拷贝。

(2). 我们使用第二种方法,实现一下代码:
在这里插入图片描述

#include<stdio.h>
#include<assert.h>
void* my_memmove(void* dest, const void* src, size_t num)
{assert(dest&&src);void* ret=dest;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);return 0;
}

在这里插入图片描述

memset使用

  1. memset函数
    在这里插入图片描述
  2. 功能:
  • memset函数是用来设置内存块的内容的,以字节为单位,将内存中指定长度的空间设为特定的内容
  • memset的使用需包含<string.h>
  1. 使用举例:
    在这里插入图片描述

memcmp使用

  1. memcmp函数:
    在这里插入图片描述
  2. 功能:
  • 比较指定的两块内存块的内容,比较从ptr1和ptr2指针指向的位置开始,向后的num个字节
  • memcmp的使用需要包含<string.h>
  1. 返回值:
    在这里插入图片描述
    4.使用举例:
    在这里插入图片描述
    前十六个字节相同,所以==
    在这里插入图片描述
http://www.dtcms.com/a/346376.html

相关文章:

  • TTS文字合成语音芯片的使用场景
  • No module named blake2b
  • GaussDB GaussDB 数据库架构师修炼(十八)SQL引擎(1)-SQL执行流程
  • ODDR双边沿数据输出
  • 1小时检测cAMP的武功秘籍
  • AI 绘画争议背后:版权归属、艺术原创性与技术美学的三方博弈
  • Linux系统安装llama-cpp并部署ERNIE-4.5-0.3B
  • Unity--判断一个点是否在扇形区域里面(点乘和叉乘的应用)
  • Day2--HOT100--283. 移动零,11. 盛最多水的容器,15. 三数之和
  • 94. 城市间货物运输 I, Bellman_ford 算法, Bellman_ford 队列优化算法
  • 【Android】 连接wifi时,强制应用使用流量
  • 反射【Reflect】
  • 深入浅出【最小生成树】:Prim与Kruskal算法详解
  • 111、【OS】【Nuttx】【周边】效果呈现方案解析:-print0 选项
  • AQS模板方法
  • 使用 Google 开源 AI 工具 LangExtract 进行结构化信息抽取
  • 单片机---------WIFI模块
  • Seaborn数据可视化实战:Seaborn数据可视化入门-绘制统计图表与数据分析
  • Dify 从入门到精通(第 49/100 篇):Dify 的自动化测试
  • STM32 硬件I2C读写MPU6050
  • 【链表 - LeetCode】24. 两两交换链表中的节点
  • 纯手撸一个RAG
  • 黄飞对话小熊电器流程与IT负责人:企业数字化进阶与AI实践如何落地?
  • QIcon::actualSize的作用和用法
  • 2025/8/22 xxl-job速通
  • 解决 微信开发者工具 :下载基础库版本 2.31.0 失败
  • RAG和微调是什么?两者的区别?什么场景使用RAG或微调?判断依据是什么?
  • LINUX网络编程--网络的发展与通信
  • AI赋能环保精准治理:AI水质监测溯源快、空气质量预测施策准,守护生态新效能
  • 关于 java+gradle的弹窗多选应用app