【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容器和智能指针,来提高代码的可读性和安全性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/7857.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

系统思考—问题分析

很多中小企业都在面对转型的难题&#xff1a;市场变化快&#xff0c;资源有限&#xff0c;团队协作不畅……这些问题似乎总是困扰着我们。就像最近和一位企业主交流时&#xff0c;他提到&#xff1a;“我们团队每天都很忙&#xff0c;但效率始终没见提升&#xff0c;感觉像是在…

π0:仅有3B数据模型打通Franka等7种机器人形态适配,实现0样本的完全由模型自主控制方法

Chelsea Finn引领的Physical Intelligence公司&#xff0c;专注于打造先进的机器人大模型&#xff0c;近日迎来了一个令人振奋的里程碑。在短短不到一年的时间内&#xff0c;该公司成功推出了他们的首个演示版本。这一成就不仅展示了团队的卓越技术实力&#xff0c;也预示着机器…

第二十一周:Mask R-CNN

Mask R-CNN 摘要Abstract文章信息研究动机Mask RCNNRoIPool与RoIAlign 双线性插值Mask Branch(FCN)其他细节Mask RCNN损失Mask分支预测 网络搭建创新点与不足总结 摘要 本篇博客介绍了Mask R-CNN&#xff0c;这是一种用于实例分割的模型&#xff0c;能够在目标检测的基础上实现…

Windows本地部署(DeepSeek-R1-Distill-Qwen-1.5B)模型

文章目录 Windows本地部署&#xff08;DeepSeek-R1-Distill-Qwen-1.5B&#xff09;模型本机环境运行环境安装安装 WSL2&#xff0c;启用linux 系统进入linux 系统后&#xff0c;安装以下软件安装 Anaconda3安装 CUDA安装 pip创建虚拟环境并安装 vllm 模型下载模型运行部署模型测…

Java 大视界 -- Java 大数据在元宇宙中的关键技术与应用场景(65)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

【QT】 控件 -- 显示类

&#x1f525; 目录 [TOC]( &#x1f525; 目录) 1. 前言 2. 显示类控件2.1 Label 1、显示不同文本2、显示图片3、文本对齐、自动换行、缩进、边距4、设置伙伴 3.2 LCD Number 3.3 ProgressBar 3.4 Calendar Widget 3. 共勉 &#x1f525; 1. 前言 之前我在上一篇文章【QT】…

大数据之路:阿里巴巴大数据实践(1)

第一章 总述 第二章 日志采集 2.1 浏览器的页面日志采集 览器的页面型产品/服务的日志采集可分为如下两大类 &#xff08;1&#xff09;页面浏览&#xff08;展现&#xff09;日志采集。顾名思义&#xff0c;页面浏览日志是指&#xff1a;一个页面被浏览器加载呈现时采集的日…

定时器按键tim_key模版

低优先级放在高优先级内势必是程序卡死 把高优先级放到低优先级内&#xff0c;会使程序卡死 可修改 Debuger调试方法 Pwm rcc #include "my_main.h" uint8_t led_sta0x10; char text[30]; void LED_Disp(uint8_t dsLED) {HAL_GPIO_WritePin(GPIOC,GPIO_PIN_All,GPI…

Linux的权限和一些shell原理

目录 shell的原理 Linux权限 sudo命令提权 权限 文件的属性 ⽂件类型&#xff1a; 基本权限&#xff1a; chmod改权限 umask chown 该拥有者 chgrp 改所属组 最后&#xff1a; 目录权限 粘滞位 shell的原理 我们广义上的Linux系统 Linux内核Linux外壳 Linux严格…

【ComfyUI专栏】ComfyUI 部署Kolors

什么是Kolors?我相信一定会有朋友可能第一次听说这个生图的模型,开始我也很难想象,这竟然是快手推出的可灵AI的项目,我们可以直接利用模型来生成图片和视频。 大家可以通过直接访问可灵AI的网址获取到可灵的项目,但是对于我们来说我们需要基于ComfyUI来生成必要的图片和视…

vue3+elementPlus之后台管理系统(从0到1)(day4-完结)

面包屑 创建一个面包屑组件 将路由导入然后格式化map对象 key-value 将当前路由的key和value获取然后存入list数组中 遍历list数据&#xff0c;渲染内容 <!--BreadcrumbCom.vue--> <template><el-breadcrumb separator">"><el-breadcrum…

非根目录部署 nextjs 项目,资源文件 请求404 的问题

最近在学习next项目编写的代码放到服务器上静态资源404 先分析问题 到服务器上查看是有资源目录的是不是项目配置有问题是不是nginx配置有问题 经过排查1和2是没有问题的目前来看只有3 检查一下nginx配置 尝试着把静态资源的配置禁用 问题解决 我的next项目用的是pm2管理…

【Leetcode刷题记录】15.三数之和

15. 三数之和 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。 请你返回所有和为 0 且不重复的三元组。 注意&#xff1a;答案中不可以包含重复的三…

豆包 MarsCode + 开源 = ?AI 助力开源社区新人成长

来源&#xff5c;豆包 MarsCode “开源” 这个词&#xff0c;对开发者来说&#xff0c;可能是入门时的第一步&#xff0c;也可能是追求极致技术的终点。无数优秀的开源项目不仅推动了技术的进步&#xff0c;也成为开发者学习和成长的宝藏&#xff0c;但同时也因为其规模庞大、代…

【Linux】IPC:匿名管道、命名管道、共享内存

⭐️个人主页&#xff1a;小羊 ⭐️所属专栏&#xff1a;Linux 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 1、管道2、进程池3、命名管道4、共享内存 1、管道 我们知道进程具有独立性&#xff0c;但是在一些场景中进程间也需要通信&#…

python生成图片和pdf,快速

1、下载安装 pip install imgkit pip install pdfkit2、wkhtmltopdf工具包&#xff0c;下载安装 下载地址&#xff1a;https://wkhtmltopdf.org/downloads.html 3、生成图片 import imgkit path_wkimg rD:\app\wkhtmltopdf\bin\wkhtmltoimage.exe # 工具路径&#xff0c;安…

location的使用规则

1、基于URL的location 负责均衡配置 后端集群中的web服务器&#xff0c;必须要有对应的目录和文件才能被访问到 http {include mime.types;default_type application/octet-stream;sendfile on;keepalive_timeout 65;upstream default_pool {server 10.0.0.7:…

ComfyUI实现老照片修复——AI修复老照片(ComfyUI-ReActor / ReSwapper)解决天坑问题及加速pip下载

AI修复老照片&#xff0c;试试吧&#xff0c;不一定好~~哈哈 2023年4月曾用过ComfyUI&#xff0c;当时就感慨这个工具和虚幻的蓝图很像&#xff0c;以后肯定是专业人玩的。 2024年我写代码去了&#xff0c;AI做图没太关注&#xff0c;没想到&#xff0c;现在ComfyUI真的变成了工…

基于C++的DPU医疗领域编程初探

一、大型医院数据处理困境与 DPU 的崛起 在数字化浪潮的席卷下,医疗行业正经历着深刻变革,大型医院作为医疗服务的核心枢纽,积累了海量的数据,涵盖患者的基本信息、诊断记录、检验报告、影像资料等多个维度。这些数据不仅规模庞大,而且增长速度迅猛,传统的中央处理器(C…

C#新语法

目录 顶级语句&#xff08;C#9.0&#xff09; using 全局using指令&#xff08;C#10.0&#xff09; using资源管理问题 using声明&#xff08;C#8.0&#xff09; using声明陷阱 错误写法 正确写法 文件范围的命名空间声明&#xff08;C#10.0&#xff09; 可空引用类型…