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

C语言--动态内存【详细解释】


一.动态内存介绍🍗

在C语言中,动态内存分配是指在程序运行时根据需要动态申请内存空间,以便在程序的不同阶段存储和使用数据。动态内存的分配与释放需要一组函数来实现,包括malloc、calloc、realloc和free。

  1. malloc: 函数用于分配指定大小的内存块,并返回指向该内存块起始地址的指针。语法为:void *malloc(size_t size);

  2. calloc: 函数用于分配指定数量和大小的内存块,并将内存块中的每个字节初始化为0。语法为:void *calloc(size_t num, size_t size);

  3. realloc: 函数用于重新分配已经分配的内存块的大小,可以增大或减小内存块的大小。语法为:void *realloc(void *ptr, size_t size);

  4. free: 函数用于释放通过malloc、calloc或realloc函数分配的内存块,以便将其归还给系统。语法为:void free(void *ptr);

动态内存分配区域:堆(heap),很大接近可用内存,内存申请和销毁需要程序自行管理 
内存什么情况还给系统: 1.程序(进程)退出 2.关机(重启) 
局部变量:定义在函数内部的变量,包括形参,在栈(stack)中,作用域在函数内部有效,
生存周期:进入函数 创建,退出函数销毁
void :没有,可以修饰返回值或参数列表 void *:通用指针,仅仅只标记地址,不包含类型信息 
应用场景: 
1.需要根据变量作为长度定义数组 
2.函数结束后还需要继续使用的内存(例如返回局部数组的地址,链表)
3.长度较大的数组(大内存,超过栈1M的大小)

二.malloc函数的用法🍗

1.需要根据变量作为长度定义数组

2.函数结束后还需要继续使用的内存(例如返回局部数组的地址,链表)

正确的写法


3.长度较大的数组(大内存,超过栈1M的大小)


二.calloc函数的用法🍗

calloc会把动态申请的内存每个单元初始化为0.


三.free崩溃的原因🍗

1.越界
2.移动指针 
3.重复释放或者释放非动态内存
#include<stdio.h>
#include<stdlib.h>
//1.越界
int main()
{int n = 10;int* arr = (int*)malloc(n);assert(arr != NULL);for (int i = 0; i < n; i++)arr[i] = i;for (int i = 0; i < n; i++)printf("%d ", arr[i]);printf("\n");free(arr);return 0;
}//2.移动指针
int main()
{int n = 10;int* arr = (int*)malloc(n * sizeof(int));assert(arr != NULL);for (int i = 0; i < n; i++){//arr[i] = i;*arr = i;arr++;}printf("\n");free(arr);return 0;
}//重复释放同一段内存
int main()
{int n = 10;int* arr = (int*)malloc(n * sizeof(int));assert(arr != NULL);for (int i = 0; i < n; i++){arr[i] = i;}printf("%p\n", arr);free(arr);printf("%p\n", arr);//arr是野指针free(NULL);//可以//free(arr);//崩溃,重复释放return 0;
}

如果对您有帮助的话,给小编一个免费的赞以表鼓励吧🍗

相关文章:

C语言--动态内存【详细解释】

一.动态内存介绍&#x1f357; 在C语言中&#xff0c;动态内存分配是指在程序运行时根据需要动态申请内存空间&#xff0c;以便在程序的不同阶段存储和使用数据。动态内存的分配与释放需要一组函数来实现&#xff0c;包括malloc、calloc、realloc和free。 malloc: 函数用于分配…...

施工现场安全管理系统

伴随着社会发展&#xff0c;各行各业都十分注重安全生产管理&#xff1b;建筑施工行业&#xff0c;由于施工环境具有复杂性、危险源较多、施工人员素质参差不齐等因素&#xff0c;导致安全事故时有发生&#xff1b;凡尔码施工安全管理系统&#xff0c;灵活根据施工现场管理要求…...

电线电缆行业生产管理MES系统解决方案

电线电缆行业生产管理mes系统核心功能 基础数据管理&#xff1a;对基础数据进行统一管理&#xff0c;包括组织架构、原材料数据、设备数据、报工数据、检验数据、员工数据等工艺与BOM管理&#xff1a;对工艺标准进行统一管理&#xff0c;包括工艺的版本管理、关联型号管理&…...

滑动窗口最大值和前K个高频元素

滑动窗口最大值和前K个高频元素 239. 滑动窗口最大值 核心&#xff1a;建立一个单调队列&#xff0c;维护里面的最大值&#xff0c;并且从大到小的顺序即可&#xff01;【只需要维护有可能成为窗口里最大值的元素就可以了&#xff0c;同时保证队列里的元素数值是由大到小的。…...

C语言实现在顺序表中找到最大值

用C语言实现在顺序表中找到最大值&#xff1a; #include <stdio.h> #define MAX_SIZE 100 int findMax(int arr[], int size) { int max arr[0]; // 假设第一个元素为最大值 for (int i 1; i < size; i) { // 从第二个元素开始遍历列表 if (…...

数字工厂管理系统建设层级分为哪几层

随着工业4.0时代的到来&#xff0c;数字工厂已成为制造业转型升级的必经之路。数字工厂管理系统作为数字工厂的核心组成部分&#xff0c;对于提高生产效率、降低成本、提升质量等方面具有重要意义。数字工厂管理系统的建设层级一般分为以下几个层次&#xff0c;本文将对其进行详…...

MySQL 8 update语句更新数据表里边的数据

数据重新补充 这里使用alter table Bookbought.bookuser add userage INT after userphone;为用户表bookuser在userphone列后边添加一个类型为INT的新列userage。 使用alter table Bookbought.bookuser add sex varchar(6) after userage ;为用户表bookuser在userage 列后边添…...

可视化监控云平台/智能监控平台EasyCVR国标设备开启音频没有声音是什么原因?

视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同&#xff0c;支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。GB28181视频平台EasyCVR拓展性强&#xff0c;视频能力丰富&#xff0c;具体可实现视频监控直播、视频轮播、视频录像、云存…...

L1-039:古风排版

题目描述 中国的古人写文字&#xff0c;是从右向左竖向排版的。本题就请你编写程序&#xff0c;把一段文字按古风排版。 输入格式&#xff1a; 输入在第一行给出一个正整数N&#xff08;<100&#xff09;&#xff0c;是每一列的字符数。第二行给出一个长度不超过1000的非空字…...

树莓派新手装机指南

如果你决定买一个树莓派&#xff0c;那么你一定已经了解过&#xff0c;不需要再做多余的介绍&#xff0c;由于之前就玩过树莓派&#xff0c;还是想弄一个属于自己的树莓派&#xff0c;因为它就像一个微型电脑&#xff0c;耗电非常低&#xff0c;我可以在家里24小时开机&#xf…...

flink使用事件时间时警惕kafka不同分区的事件时间倾斜问题

背景 flink和kafka的消息组合消费模式几乎是实时流处理的标配&#xff0c;然后当在flink中使用事件时间处理时&#xff0c;需要注意kafka不同分区元素之间时间相差太大的问题&#xff0c;这样有可能会导致严重的数据堆积问题 kafka不同分区元素事件时间差异较大导致的问题 总…...

『App自动化测试之Appium基础篇』| Desired Capabilities详解与使用

App自动化测试之Appium基础篇』| Desired Capabilities详解与使用 1 关于appium driver2 安装appium driver3 安装Appium Python Client4 安装测试对象5 获取测试对象信息5.1 使用dumpsys5.2 使用AndroidKiller5.3 使用aapt 6 Capabilities详解6.1 Capabilities介绍6.2 automat…...

vscode插件webview和插件通信

如果你要在 VS Code 插件的 WebView 中调用插件中的方法&#xff0c;可以使用 vscode.postMessage API。具体步骤如下&#xff1a; 在插件中&#xff0c;在创建 WebView 时&#xff0c;指定一个 onDidReceiveMessage 回调方法&#xff0c;该方法会在 WebView 中调用 vscode.po…...

【STM32单片机】贪吃蛇游戏设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用STM32F103C8T6单片机控制器&#xff0c;使用IIC OLED模块、按键等。 主要功能&#xff1a; 系统运行后&#xff0c;OLED显示游戏界面&#xff0c;可通过K1-K4键控制蛇的方向&#xff0c;当蛇吃…...

【Java 基础】32 定时调度

文章目录 Timer 类创建 Timer注意事项 ScheduledExecutorService 接口创建 ScheduledExecutorService注意事项 选择合适的定时调度方式Timer 的适用场景ScheduledExecutorService 的适用场景 总结 在软件开发中&#xff0c;定时任务是一种常见的需求&#xff0c;用于周期性地执…...

C++ 教程 - 02 复合数据类型

文章目录 数组vector字符串输入输出结构体枚举指针引用综合案例 数组 相同类型的数据的集合{ }&#xff0c;通过索引访问元素&#xff1b;在内存中连续存储&#xff0c;属于顺序表&#xff1b;插入、删除时间复杂度 O ( n ) O(n) O(n)&#xff0c;访问复杂度 O ( 1 ) O(1) O(1…...

【数据处理】NumPy数组的合并操作,如何将numpy数组进行合并?

&#xff0c;NumPy中的合并操作是指将两个或多个数组合并成一个数组的操作。这种操作可以通过不同的函数来实现。 一、横向合并&#xff08;水平合并&#xff09; 横向合并是指将两个具有相同行数的数组按列方向合并成一个数组的操作。在NumPy中&#xff0c;可以使用hstack()…...

JavaScript实现飘窗功能

实现飘窗功能很简单 html代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title…...

Docker笔记:容器转换成镜像,导出导入镜像,数据拷贝,查看日志

docker commit 将容器转换成镜像 可以把容器转换成镜像镜像没有写入权限&#xff0c;但可以通过修改容器把容器制作成新镜像启动容器后&#xff0c;就给容器提供了一个可写层&#xff0c; 在容器里&#xff0c;可安装软件&#xff0c;可创建文件 …转换成镜像&#xff0c;之后…...

串行计时芯片D1380/D1381,2.0V~5.5V 工作电流: 2V时 与TTL 兼容,采用DIP8、SOP8封装

D1380/D1381是一个带秒、分、时、日、日期、月、年的串行时钟保持芯片,每个月多少天以及闰年能自动调节, D1380/D1381低功耗工作方式, D1380/D1381用若干寄存器存储对应信息&#xff0c;一个32.768kHz 的晶振校准时钟&#xff0c;为了使用最小弓|脚&#xff0c;D1380/D1381使用…...

LibEdificio嵌入式教学库:硬件映射驱动与楼宇灯光实验平台

1. 项目概述LibEdificio 是一款面向嵌入式教育平台的专用控制库&#xff0c;专为“Building Lights 教学系统”&#xff08;楼宇灯光教学实验平台&#xff09;设计。该系统并非通用工业楼宇自控设备&#xff0c;而是一套结构化、模块化、可编程的硬件教学套件&#xff0c;广泛应…...

Cuvil + HuggingFace Pipeline端到端加速实录:BERT-base推理延迟从142ms降至31ms的6个关键编译开关

第一章&#xff1a;Cuvil 编译器在 Python AI 推理中的应用 面试题汇总Cuvil 是一款面向 AI 推理场景的轻量级领域专用编译器&#xff08;DSL Compiler&#xff09;&#xff0c;专为优化 Python 中基于 PyTorch/TensorFlow 模型的部署而设计。它通过静态图分析、算子融合与硬件…...

基于胸部正位X光片的两阶段对比学习椎体压缩性骨折筛查框架文献速递-多模态医学影像最新进展

2026.4.2本研究提出一种基于胸部正位X光片的双阶段对比学习框架TADC-Net&#xff0c;通过模仿放射科医生的诊断流程&#xff0c;解决了器官遮挡和类间相似性等挑战&#xff0c;实现了椎体压缩性骨折的早期精准筛查&#xff0c;显著提升了诊断性能和临床辅助准确性。Title题目01…...

74HC595移位寄存器驱动原理与CrazyHC595库深度解析

1. CrazyHC595库概述&#xff1a;面向嵌入式工程师的74HC595移位寄存器驱动深度解析74HC595是工业界最经典、应用最广泛的8位串行输入/并行输出移位寄存器芯片之一。其核心价值在于以3根GPIO线&#xff08;数据、时钟、锁存&#xff09;扩展出8个可独立控制的数字输出通道&…...

大厂真实高频的 LLM 大模型面试 36 题例题详解

一、基础原理篇(8 题) 1. 什么是 Transformer?核心结构是什么? 答:Transformer 是基于自注意力机制的 seq2seq 模型,完全替代 RNN 结构。核心结构: Encoder(编码)+ Decoder(解码) 多头注意力(Multi-Head Attention) 前馈网络 FFN 层归一化、残差连接举例:GPT 只…...

2026知识付费SaaS避坑指南:数据安全与系统稳定性实测,创客匠人为何值得托付?

在知识付费行业&#xff0c;大多数选型对比只关注“前台功能”&#xff1a;能不能卖课、能不能直播、有没有拼团。但真正决定生意生死的&#xff0c;往往是看不见的“底层能力”——数据是否安全&#xff1f;系统是否稳定&#xff1f;学员资产能否真正归你所有&#xff1f;过去…...

Agentic SOC:AI原生时代,安全运营的终极范式革命

2026年RSAC全球网络安全大会上&#xff0c;一个现象级的行业转折正在发生&#xff1a;全场超过90%的主流安全厂商将核心展位与重磅发布聚焦于Agentic SOC&#xff0c;全球500强企业中超过62%已启动相关试点&#xff0c;21%完成了核心生产环境的规模化落地。与之形成强烈对比的是…...

WPF高性能绘图避坑指南:为什么你的心电图曲线会让CPU飙升?

WPF高性能绘图避坑指南&#xff1a;为什么你的心电图曲线会让CPU飙升&#xff1f; 在医疗监护设备或金融行情系统中&#xff0c;实时波形渲染的卡顿可能直接导致误诊或交易延迟。当你的WPF应用在绘制每秒60帧的心电图时突然出现CPU占用率突破90%&#xff0c;这往往不是硬件性能…...

大数据标注工具对比:2023年最值得推荐的5款工具

大数据标注工具对比&#xff1a;2023年最值得推荐的5款工具关键词&#xff1a;大数据标注工具、2023年推荐、工具对比、标注效率、标注质量摘要&#xff1a;本文聚焦于2023年大数据标注领域&#xff0c;详细对比了五款极具代表性的大数据标注工具。通过对它们的核心概念、算法原…...

【OpenClaw从入门到精通】第54篇:物理隔离“龙虾”——傻福虾盘与Docker沙箱实战对比(2026实测版)

摘要:2026年工信部NVDB平台及CNCERT指南明确要求:OpenClaw需在隔离环境中部署,严禁在办公设备直接运行。本文聚焦两大主流隔离方案——物理隔离(闲置旧电脑/专用硬件盒子)与Docker沙箱,系统拆解从原理到实操的全流程。包含3套完整部署案例、15+安全配置命令、容器逃逸风险…...