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

【C语言】内存函数介绍(上)

C语言学习

内存函数
友情链接:C语言专栏


文章目录

  • C语言学习
  • 一、memcpy 使用和模拟实现
  • 二、memmove 使用
  • 附录
    • 上文链接
    • 专栏


一、memcpy 使用和模拟实现

memcpy是C语言标准库中的一个函数,用于将一段内存中的内容复制到另一段内存中。头文件是<string.h>
函数原型:

void * memcpy ( void * dest, const void * src, size_t num );

解释:

  • 函数memcpy从src的位置开始向后复制num个字节的数据到dest指向的内存位置。
  • 这个函数在遇到 ‘\0’ 的时候并不会停下来。
  • 如果src和dest有任何的重叠,复制的结果都是未定义的。
  • 返回目标内存的指针,也就是dest的值;

使用示例:

#include <stdio.h>
#include <string.h>
int main()
{int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };int arr2[10] = { 0 };memcpy(arr2, arr1, 20);int i = 0;for (i = 0; i < 10; i++){printf("%d ", arr2[i]);}return 0;
}

输出想必都想到了:
在这里插入图片描述
那万一存在重叠的内存,怎么办?
不用着急,对于重叠的内存,交给memmove来处理。
memcpy的模拟实现:

#include <assert.h>
void* my_memcpy(void* dest, const void* src, size_t num)
{assert(dest && src);char* s1 = (char*)dest;const char* s2 = (const char*)src;while (num--){*s1++ = *s2++;}return dest;
}

实现很简单,就逐字节的复制。

二、memmove 使用

memmove是 语言标准库中的一个函数,用于将指定数量的字节从源内存块复制到目标内存块。与memcpy不同,memmove可以安全地处理内存重叠的情况,避免数据损坏。头文件是<string.h>
函数原型:

void * memmove ( void * dest, const void * src, size_t num );

说明:

  • 和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。
  • 如果源空间和目标空间出现重叠,就得使用memmove函数处理。

使用示例:

#include <stdio.h>
#include <string.h>
int main()
{int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };memmove(arr1 + 2, arr1, 20);int i = 0;for (i = 0; i < 10; i++){printf("%d ", arr1[i]);}return 0;
}

输出:
在这里插入图片描述


附录

上文链接

《字符串与字符函数详解(下)》

专栏

C语言专栏

http://www.dtcms.com/a/289021.html

相关文章:

  • axios二次封装-单个、特定的实例的拦截器、所有实例的拦截器。
  • 【机器学习深度学习】量化与选择小模型的区别:如何理解两者的优势与局限?
  • 嵌入式硬件篇---核心板制作
  • nginx定期清理日志
  • 【面向对象】C++类实现计数器:从理论到实践的编程之旅
  • RK3588 编译 Android 13 镜像方法
  • 基于有监督学习的主动攻击检测系统
  • Softhub软件下载站实战开发(十九):软件信息展示
  • MCP与智能问数技术全面指南:从协议设计到智能化数据查询
  • Flink高频考点:Checkpoint与Savepoint的高可用实战指南
  • 购物--贪心例题
  • LLM指纹底层技术——噪声鲁棒性机制
  • 英伟达:拓展LLM训练过程
  • Day1||Vue指令学习
  • 小红书 MCP 服务器
  • MLA:KV Cache 的“低秩跃迁”
  • Android 项目中如何在执行 assemble 或 Run 前自动执行 clean 操作?
  • 7.19-7.20 Java基础 | File类 I/O流学习笔记
  • Python 单例模式几种实现方式
  • 【AI】模型接入初始化(Lanchain4j)
  • Effective Python 条款13:通过带星号的unpacking操作来捕获多个元素,不要用切片
  • 第十八节:第六部分:java高级:注解、自定义注解、元注解
  • 响应式编程入门教程第八节:UniRX性能分析与优化
  • BIOS+MBR微内核加载loader程序实现过程
  • 从零开始开发纯血鸿蒙应用之跨模块路由
  • 编程语言Java入门——核心技术篇(一)封装、继承和多态
  • 【图文详解】Transformer架构详细解析:多头自注意力机制、qkv计算过程、encoder架构、decoder架构以及mask的意义
  • Request和Response相关介绍
  • 假如只给物品编号和物品名称,怎么拆分为树形结构(拆出父级id和祖籍列表),用于存储具有层级关系的数据。
  • 高效培养AI代理的全能工具:Agent Reinforcement Trainer