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

【C】memory 详解

<memory.h> 是一个 C 标准库头文件,提供了一组内存管理函数,用于分配、释放和操作动态内存。这些函数主要操作的是未初始化的内存块,是早期 C 编程中常用的内存操作工具。

尽管在现代 C++ 编程中更推荐使用<cstring><memory>,但<memory.h>在兼容性和某些低级场景下仍然可能被使用。

以下是对<memory.h>中核心内容的详解:

核心功能与函数

  1. memory
void* memcpy(void* dest, const void* src, size_t n);
  • 功能:n字节的数据从源地址src复制到目标地址dest
  • 注意事项:
    • 源地址和目标地址不能重叠,如果存在重叠,行为未定义。
    • 通常用于快速内存复制。
  • 示例:
char src[] = "hello";
char dest[10];
memcpy(dest, src, sizeof(src));
  1. memmove
void* memmove(void* dest, const void* src, size_t n);
  • 功能:n字节的数据从源地址src移动到目标地址dest
  • 区别于memcpy 允许源地址和目标地址重叠。
  • 示例:
char buffer[] = "abcdef";
memmove(buffer+2, buffer, 4);	// 缓冲区重叠
  1. memset
void* memset(void* ptr, int value, size_t n);
  • 功能: 将内存块ptr的前n字节设置为指定的值value(按字节操作)。
  • 常用场景: 清零或初始化内存块。
  • 示例:
char buffer[10];
memset(buffer, 0, sizeof(buffer));	// 将整个缓冲区清零
  1. memcmp
int memcmp(const void* ptr1, const void* ptr2, size_t n);
  • 功能: 比较两块内存的前n字节。
  • 返回值:
    • 0:两块内存相等。
    • < 0ptr1 小于 ptr2
    • > 0ptr1 大于 ptr2
  • 示例:
char a[] = "abc";
char b[] = "abc";
if(memcmp(a, b, 3) == 0) {printf("Equal\n");
}
  1. malloc
void* malloc(size_t size);
  • 功能: 分配size字节的动态内存,返回指向该内存块的指针。
  • 注意: 返回的内存未初始化,可能包含垃圾值。
  • 示例:
int* arr = (int*)malloc(10 * sizeof(int)); 
  1. calloc
void* calloc(size_t num, size_t size);
  • 功能: 分配可以存储num个元素的动态内存,并初始化为零。
  • 区别于 malloc 自动清零。
  • 示例:
int* arr = (int*)calloc(10, sizeof(int)); 	// 分配10个int,初始化为0
  1. realloc
void* realloc(void* ptr, size_t new_size);
  • 功能: 调整已分配内存的大小。
  • 注意:
    • 如果 ptrNULL,行为类似于 malloc
    • 如果 new_size 为0,行为类似于 free
    • 可能返回新地址(原地址不一定保留)。
  • 示例:
int* arr = (int*)malloc(10 * sizeof(int));
arr = (int*)realloc(arr, 20 * sizeof(int)); // 扩展到 20 个int
  1. free
void free(void *ptr);
  • 功能: 释放由 malloccallocrealloc 分配的动态内存。
  • 注意:
    • 如果传递 NULLfree 不会产生任何操作。
    • 释放后,指针应置为 NULL,以避免悬空指针问题。
  • 示例:
int* arr = (int*)malloc(10 * sizeof(int));
free(arr);
arr = NULL;	// 避免悬空指针

内存管理注意事项

  1. 内存泄漏:
    • 动态分配的内存必须由程序员显式释放。
    • 释放后不要再使用该内存块(避免“悬空指针”)
  2. 指针安全:
    • 初始化指针为NULL,并在释放后将指针设置为 NULL
  3. 越界访问:
    • 确保访问的内存块不超过已分配大小。
  4. 性能考虑:
    • 动态内存分配有一定开销,频繁分配和释放可能影响性能。

<memory.h><string.h> 的区别

  • <memory.h> 是 C 语言标准的传统头文件,主要定义了内存管理和操作相关函数。
  • <string.h> 是 C 标准中更常用的头文件,包含了一些字符串处理相关的函数,例如strcpystrcat 等。
  • 在现代C++中,推荐使用<cstring>来替代<memory.h>

<memory.h> 的现代替代
在 C++ 中,更推荐使用标准模板库(STL)和智能指针(std::unique_ptrstd::shared_ptr)进行内存管理,从而减少手动操作动态内存的风险。
示例:

#include <memory>
#include <iostream>int main() {auto ptr = std::make_unique<int[]>(10);  // 自动管理内存for(int i=0; i<10; ++i) {ptr[i] = i * i;std::cout << ptr[i] << " ";}return 0;
}

总结
<memory.h> 提供了低级别的内存操作工具,适合在对性能和资源管理有较高要求的场景中使用。但在现代 C++ 编程中,更推荐使用高层抽象工具,如STL容器和智能指针,来提高代码的可读性和安全性。

相关文章:

【C】memory 详解

<memory.h> 是一个 C 标准库头文件&#xff0c;提供了一组内存管理函数&#xff0c;用于分配、释放和操作动态内存。这些函数主要操作的是未初始化的内存块&#xff0c;是早期 C 编程中常用的内存操作工具。 尽管在现代 C 编程中更推荐使用<cstring>或<memory&…...

Python 爬虫 - Selenium 框架

Python 爬虫 - Selenium 框架 安装安装 Selenium安装 WebDriver 操作浏览器打开浏览器普通方式加载配置方式Headless 方式 设置浏览器窗口最大化显示最小化显示自定义大小 前进后退前进后退 元素定位根据 id 定位根据 name 定位根据 class 定位根据标签名定位使用 CSS 定位使用…...

mysql的having语句

MySQL的HAVING语句用于在GROUP BY子句对数据进行分组后&#xff0c;过滤满足特定条件的组。与WHERE子句不同&#xff0c;HAVING子句可以在过滤条件中使用聚合函数&#xff0c;而WHERE子句则不能。通常&#xff0c;HAVING子句与GROUP BY子句一起使用&#xff0c;以实现对分组数据…...

华为数据之道-读书笔记

内容简介 关键字 数字化生产 已经成为普遍的商业模式&#xff0c;其本质是以数据为处理对象&#xff0c;以ICT平台为生产工具&#xff0c;以软件为载体&#xff0c;以服务为目的的生产过程。 信息与通信技术平台&#xff08;Information and Communication Technology Platf…...

CDN、源站与边缘网络

什么是“源站” 源服务器 源服务器的目的是处理和响应来自互联网客户端的传入请求。源服务器的概念通常与边缘服务器或缓存服务器的概念结合使用。源服务器的核心是一台运行一个或多个程序的计算机&#xff0c;这些程序旨在侦听和处理传入的客户端请求。源服务器可以承担为网…...

工业相机 SDK 二次开发-Sherlock插件

本文介绍了 sherlock 连接相机时的插件使用。通过本套插件可连接海康的工业相机。 一&#xff0e;环境配置 1. 拷贝动态库 在用户安装 MVS 目录下按照如下路径 Development\ThirdPartyPlatformAdapter 找到目 录为 DalsaSherlock 的文件夹&#xff0c;根据 Sherlock 版本找到…...

FlinkSql使用中rank/dense_rank函数报错空指针

问题描述 在flink1.16(甚至以前的版本)中&#xff0c;使用rank()或者dense_rank()进行排序时&#xff0c;某些场景会导致报错空指针NPE(NullPointerError) 报错内容如下 该报错没有行号/错误位置&#xff0c;无法排查 现状 目前已经确认为bug&#xff0c;根据github上的PR日…...

VS C++ 配置OPENCV环境

VS C 配置OPENCV环境 1.下载opencv2.安装环境3.opencv环境4.VS配置opencv环境5.EXE执行文件路径的环境lib和dll需要根据是debug还是release环境来区分使用哪个 6.Windows环境 1.下载opencv 链接: link 2.安装环境 双击运行即可 3.opencv环境 include文件路径:opencv\build\…...

【SpringSecurity】基本开发流程

文章目录 概要整体架构流程实现流程1、编写各种Handler2 、AccessToken处理器3、定义AuthenticationFilter 继承 OncePerRequestFilter &#xff08;OncePerRequestFilter是Spring提供的一个过滤器基类&#xff0c;它确保了在一次完整的HTTP请求中&#xff0c;无论请求经过多少…...

Redis实战(黑马点评)——关于缓存(缓存更新策略、缓存穿透、缓存雪崩、缓存击穿、Redis工具)

redis实现查询缓存的业务逻辑 service层实现 Overridepublic Result queryById(Long id) {String key CACHE_SHOP_KEY id;// 现查询redis内有没有数据String shopJson (String) redisTemplate.opsForValue().get(key);if(StrUtil.isNotBlank(shopJson)){ // 如果redis的数…...

ChatGPT从数据分析到内容写作建议相关的46个提示词分享!

在当今快节奏的学术环境中&#xff0c;研究人员面临着海量的信息和复杂的研究任务。幸运的是&#xff0c;随着人工智能技术的发展&#xff0c;像ChatGPT这样的先进工具为科研人员提供了强大的支持。今天就让我们一起探索如何利用ChatGPT提升研究效率进一步优化研究流程。 ChatG…...

在 Windows 11 中设置 WSL2 Ubuntu 的 `networkingMode=mirrored` 详细教程

在 Windows 11 中设置 WSL2 Ubuntu 的 networkingModemirrored 详细教程 引言环境要求配置 .wslconfig 文件重启 WSL2验证镜像网络模式解决常见问题其他注意事项结论 引言 在 Windows 11 中使用 WSL2&#xff08;Windows Subsystem for Linux 2&#xff09;时&#xff0c;默认…...

万字长文总结前端开发知识---JavaScriptVue3Axios

JavaScript学习目录 一、JavaScript1. 引入方式1.1 内部脚本 (Inline Script)1.2 外部脚本 (External Script) 2. 基础语法2.1 声明变量2.2 声明常量2.3 输出信息 3. 数据类型3.1 基本数据类型3.2 模板字符串 4. 函数4.1 具名函数 (Named Function)4.2 匿名函数 (Anonymous Fun…...

怎么样把pdf转成图片模式(不能复制文字)

贵但好用的wps&#xff0c; 转换——转为图片型pdf —————————————————————————————————————————— 转换前&#xff1a; 转换后&#xff1a; 肉眼可见&#xff0c;模糊了&#xff0c;且不能复制。 其他免费办法&#xff0c;参考&…...

本地centos网络配置

1、路径 2、配置 另外还需要...

kotlin内联函数——runCatching

1.runCatching作用 代替try{}catch{}异常处理&#xff0c;用于捕获异常。 2.runCatching函数介绍 参数&#xff1a;上下文引用对象为参数返回值&#xff1a;lamda表达式结果 调用runCatching函数&#xff0c;如果调用成功则返回其封装的结果&#xff0c;并可回调onSuccess函…...

Python3 正则表达式:文本处理的魔法工具

Python3 正则表达式&#xff1a;文本处理的魔法工具 内容简介 本系列文章是为 Python3 学习者精心设计的一套全面、实用的学习指南&#xff0c;旨在帮助读者从基础入门到项目实战&#xff0c;全面提升编程能力。文章结构由 5 个版块组成&#xff0c;内容层层递进&#xff0c;逻…...

《DiffIR:用于图像修复的高效扩散模型》学习笔记

paper&#xff1a;2303.09472 GitHub&#xff1a;GitHub - Zj-BinXia/DiffIR: This project is the official implementation of Diffir: Efficient diffusion model for image restoration, ICCV2023 目录 摘要 1、介绍 2、相关工作 2.1 图像恢复&#xff08;Image Rest…...

windows平台通过命令行安装前端开发环境

访问node.js官网 访问node.js官网https://nodejs.org/en/download/&#xff0c;可以看到类似画面&#xff1a; 可以获取以下命令 # Download and install fnm: winget install Schniz.fnm # Download and install Node.js: fnm install 22 # Verify the Node.js version: no…...

记交叉编译asio_dtls过程

虽然编译成功了&#xff0c;但是还是有一些不妥的地方&#xff0c;参考一下就行了。 比如库的版本选择就有待商榷&#xff0c;我这里不是按照项目作者的要求严格用对应的版本编译的&#xff0c;这里也可以注意一下。 编译依赖库asio 下载地址, 更正一下&#xff0c;我其实用…...

Qwen3-VL-8B效果惊艳展示:识别电路图并解释工作原理与元器件作用

Qwen3-VL-8B效果惊艳展示&#xff1a;识别电路图并解释工作原理与元器件作用 1. 视觉语言模型的电路理解突破 Qwen3-VL-8B作为新一代多模态大模型&#xff0c;在电路图识别和理解方面展现出了令人惊艳的能力。传统的文本模型只能处理文字描述&#xff0c;而Qwen3-VL-8B能够直…...

实战指南:在CentOS 8上部署与配置BIND DNS权威服务器

1. 为什么要在CentOS 8上搭建DNS服务器&#xff1f; 想象一下这样的场景&#xff1a;公司内部有几十台服务器&#xff0c;每次新同事入职都要发一份IP地址对照表&#xff1b;开发团队每次联调测试都要反复确认服务地址&#xff1b;运维人员排查问题时要在记事本里翻找各种192.1…...

ESP32/ESP8266嵌入式IoT工具库:轻量、可靠、生产就绪

1. 项目概述esp-iot-utils是面向 ESP32 和 ESP8266 平台的轻量级、生产就绪型嵌入式 IoT 工具集。它并非功能堆砌的“大而全”框架&#xff0c;而是以工程师视角提炼出高频、重复、易出错的底层任务——网络通信、结构化数据解析、时间同步、配置持久化与系统状态管理——并封装…...

移动端Transformer加速新范式:EAA注意力机制与SwiftFormer架构解析

1. 移动端Transformer的算力困局与EAA的破局思路 当Transformer架构从NLP领域跨界到计算机视觉时&#xff0c;所有人都被ViT的表现惊艳到了。但当我们兴冲冲地想把这种"视觉Transformer"塞进手机里时&#xff0c;现实给了我们当头一棒——传统的多头自注意力机制&…...

OCS2与Pinocchio联调避坑指南:如何让机械臂MPC求解速度提升3倍?

OCS2与Pinocchio联调避坑指南&#xff1a;如何让机械臂MPC求解速度提升3倍&#xff1f; 在工业机械臂控制领域&#xff0c;实时模型预测控制&#xff08;MPC&#xff09;的求解效率直接决定了系统的响应速度与稳定性。OCS2作为ETH Zurich开发的高性能MPC求解器&#xff0c;结合…...

球机器人研究报告【202600001】

文章目录球机器人研究报告综合分析多智能体推箱子训练&#xff08;第100代/第300代&#xff09;一、意识流分析&#xff08;神经网络脉冲活动&#xff09;1. 热图&#xff08;consciousness_agent2_gen100_ep0_heatmap.png&#xff09;2. PCA&#xff08;主成分分析&#xff0c…...

FastbootEnhance:Windows上最直观的Fastboot工具箱与Payload提取器

FastbootEnhance&#xff1a;Windows上最直观的Fastboot工具箱与Payload提取器 【免费下载链接】FastbootEnhance A user-friendly Fastboot ToolBox & Payload Dumper for Windows 项目地址: https://gitcode.com/gh_mirrors/fa/FastbootEnhance 还在为复杂的Fastb…...

音频工程师必看:奈奎斯特采样定理在实际录音中的5个常见误区

音频工程师必看&#xff1a;奈奎斯特采样定理在实际录音中的5个常见误区 在专业音频制作领域&#xff0c;采样率设置是决定录音质量的基础性环节。许多工程师虽然熟悉44.1kHz或48kHz这些标准数字&#xff0c;却对背后的奈奎斯特采样定理存在认知偏差。这些误解轻则导致后期处理…...

Python接口与抽象基类:构建可扩展系统的终极指南

Python接口与抽象基类&#xff1a;构建可扩展系统的终极指南 【免费下载链接】example-code Example code for the book Fluent Python, 1st Edition (OReilly, 2015) 项目地址: https://gitcode.com/gh_mirrors/ex/example-code Python接口与抽象基类是构建可扩展、可维…...

解锁Blender操作可视化:6大核心价值与7个实战技巧提升300%教程质量

解锁Blender操作可视化&#xff1a;6大核心价值与7个实战技巧提升300%教程质量 【免费下载链接】Screencast-Keys Blender Add-on: Screencast Keys 项目地址: https://gitcode.com/gh_mirrors/sc/Screencast-Keys 在数字创作领域&#xff0c;操作可视化是连接创作者与观…...