文章目录

  • 一、为什么需要动态内存分配?
  • 二、malloc 和 free
    • 1. malloc
    • 2. free
  • 三、calloc 和 realloc
    • 1. calloc
    • 2. realloc
  • 四、常见的动态内存错误
    • 1. 对 NULL 解引用
    • 2. 越界访问
    • 3. 对非动态内存使用 free
    • 4. 释放部分动态内存
    • 5. 多次释放同一块内存
    • 6. 内存泄漏
  • 五、动态内存经典题目分析
  • 六、柔性数组(Flexible Array)
    • 1.定义
    • 2.特点
    • 3.优势
  • 七、C/C++ 程序内存区域划分
  • 总结


一、为什么需要动态内存分配?

已掌握的内存开辟方式:

· int val = 20; → 栈上开辟4字节
· char arr[10] = {0}; → 栈上开辟10字节连续空间

局限性:

· 空间大小固定
· 数组长度必须在编译时确定

动态内存分配的优势:

· 程序运行时才能确定所需空间大小
· 动态申请和释放,更灵活


二、malloc 和 free

1. malloc

void* malloc(size_t size);

· 成功:返回指向开辟空间的指针
· 失败:返回 NULL
· 返回值类型为 void*,需强制转换
· 若 size = 0,行为未定义(编译器决定)

2. free

void free(void* ptr);

· 释放动态开辟的内存
· 若 ptr 非动态开辟,行为未定义
· 若 ptr 为 NULL,函数什么也不做

示例:

#include <stdio.h>
#include <stdlib.h>int main() {int num;scanf("%d", &num);int* ptr = (int*)malloc(num * sizeof(int));if (ptr != NULL) {for (int i = 0; i < num; i++) {ptr[i] = 0;}}free(ptr);ptr = NULL; // 避免野指针return 0;
}

三、calloc 和 realloc

1. calloc

void* calloc(size_t num, size_t size);

· 为 num 个大小为 size 的元素开辟空间
· 并将每个字节初始化为 0
· 与 malloc 的区别:自动初始化

示例:

int* p = (int*)calloc(10, sizeof(int));
// 输出:0 0 0 0 0 0 0 0 0 0

2. realloc

void* realloc(void* ptr, size_t size);

· 调整已开辟内存的大小
· ptr:原内存地址
· size:新大小
· 返回新内存起始地址

两种情况:

  1. 原空间后方有足够空间 → 直接扩展
  2. 原空间后方不足 → 另找空间,拷贝数据,释放原空间

使用建议:

int* tmp = (int*)realloc(ptr, new_size);
if (tmp != NULL) {ptr = tmp;
} else {// 处理失败
}

四、常见的动态内存错误

1. 对 NULL 解引用

int *p = (int*)malloc(INT_MAX/4);
*p = 20; // 可能崩溃

2. 越界访问

for (i = 0; i <= 10; i++) {*(p + i) = i; // i=10 越界
}

3. 对非动态内存使用 free

int a = 10;
int *p = &a;
free(p); // 错误

4. 释放部分动态内存

p++;
free(p); // p 不指向起始位置

5. 多次释放同一块内存

free(p);
free(p); // 重复释放

6. 内存泄漏

void test() {int *p = (int*)malloc(100);// 忘记 free
}

五、动态内存经典题目分析

题目1:

void GetMemory(char *p) {p = (char*)malloc(100);
}
// 错误:传值调用,str 仍为 NULL

题目2:

char* GetMemory() {char p[] = "hello world";return p; // 返回栈内存地址,危险!
}

题目3:

void GetMemory(char **p, int num) {*p = (char*)malloc(num);
}
// 正确:传地址,可修改 str

题目4:

free(str);
if (str != NULL) { // str 已成为野指针strcpy(str, "world"); // 非法访问
}

六、柔性数组(Flexible Array)

1.定义

struct st_type {int i;int a[]; // 或 int a[0];
};

2.特点

· 必须是结构最后一个成员
· sizeof 不包含柔性数组内存
· 需用 malloc 动态分配额外空间

使用:

type_a *p = malloc(sizeof(type_a) + 100 * sizeof(int));
p->i = 100;
for (int i = 0; i < 100; i++) {p->a[i] = i;
}
free(p);

3.优势

· 一次分配、一次释放
· 内存连续,访问速度快,减少内存碎片


七、C/C++ 程序内存区域划分

区域 内容说明
栈区(stack) 局部变量、函数参数、返回地址等,系统自动分配释放
堆区(heap) 动态分配的内存,需手动管理
数据段(静态区) 全局变量、静态变量,程序结束释放
代码段 可执行代码、只读常量
内存映射段 文件映射、动态库、匿名映射
内核空间 用户代码不可访问


总结

· 动态内存管理使得程序在运行时能灵活申请和释放内存
· 使用 malloc、calloc、realloc 申请,free 释放
· 注意避免常见错误:空指针、越界、重复释放、内存泄漏等
· 柔性数组适用于动态大小的结构体成员
· 理解内存区域划分有助于更好地管理内存


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

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

相关文章

AI模型部署 - 大语言模型(LLM)部署技术与框架

目录 一、 大语言模型部署的核心挑战与关键技术 二、 主流开源部署框架深度解析 2.1. Ollama:本地部署的极简主义者 2.2. Hugging Face TGI (Text Generation Inference) 2.3. vLLM:为吞吐量而生 2.4. sglang:面向复杂提示与结构化输出的革新者 三、 特定硬件与云平台…

Windows11 GeForce GTX 1060 CUDA+CUDNN+Pytorch 下载及安装

一、查看显卡型号信息 系统&#xff1a;Windows11 显卡&#xff1a;GeForce GTX 1060 型号&#xff1a; &#xff08;1&#xff09;搜索 NVIDIA&#xff0c;选择 NVIDIA Control Panel&#xff08;2&#xff09;打开 NVIDIA control Panel&#xff0c;打开系统信息&#xff0c;…

在通义灵码中配置MCP服务

目录 查找mcp列表 通义灵码中配置MCP 使用方式 STDIO (Standard Input/Output) 组成部分&#xff1a; SSE (Server-Sent Events) 特点&#xff1a; 主要区别对比 配置方式 配置优先级 个人设置 项目设置 验证 通过MCP调用高德地图 查找mcp列表 打开ModelScope - …

网络中的IO问题(五种常见的IO方式)

什么是高效的IO&#xff1f; 正常情况下&#xff0c;IO等拷贝 高效的IO拷贝&#xff08;即让IO尽量不等&#xff09; 为什么我们平常玩电脑的时候&#xff0c;感觉不到等待的过程呢&#xff1f; 任何通信场景&#xff0c;IO通信场景&#xff0c;效率一定是有上限的. 花盆里&am…

JAVA核心基础篇-修饰符

Java 修饰符主要用于定义类、方法或变量&#xff0c;通常放在语句的最前端&#xff0c;可分为访问修饰符和非访问修饰符两类。一、访问修饰符public&#xff1a;对所有类可见&#xff0c;可用于类、接口、变量和方法。被声明为 public 的类、方法、构造方法和接口能够被任何其他…

笔试——Day46

文章目录第一题题目思路代码第二题题目思路代码第三题题目思路代码第一题 题目 AOE还是单体&#xff1f; 思路 贪心 剩余怪物数量 >x时&#xff0c;使用AOE&#xff1b;否则使用单体 代码 #include <iostream> #include <algorithm> using namespace std;…

零工合规挑战:盖雅以智能安全体系重构企业用工风控

国家税务总局发布的2025年第15号公告&#xff0c;将多种互联网平台企业纳入涉税信息报送范围&#xff0c;这让灵活用工平台的数据和网络安全问题成为行业关注的焦点。在海量零工信息和企业数据流转的过程中&#xff0c;数据泄露和网络攻击的风险不断上升&#xff0c;迫使平台在…

非线性规划学习笔记

非线性规划学习笔记 一、非线性规划的应用 非线性规划&#xff08;Nonlinear Programming, NLP&#xff09;在很多领域都有重要应用&#xff0c;主要包括&#xff1a; 工程设计优化&#xff1a;结构优化、电路参数优化、交通线路设计经济与管理&#xff1a;投资组合优化、生产计…

网络模型深度解析:CNI、Pod通信与NetworkPolicy

目录 专栏介绍 作者与平台 您将学到什么&#xff1f; 学习特色 网络模型深度解析&#xff1a;CNI、Pod通信与NetworkPolicy 第一部分&#xff1a;CNI 插件原理 - 网络基础设施的构建者 1.1 CNI 规范&#xff1a;标准化网络接入的基石 1.2 Flannel&#xff1a;简单高效的…

数据结构青铜到王者第二话---数据结构基本常识(2)

续接上一话 一、包装类 在Java中&#xff0c;由于基本类型不是继承自Object&#xff0c;为了在泛型代码中可以支持基本类型&#xff0c;Java给每个基本类型都对应了一个包装类型。 1、基本数据类型和对应的包装类 除了 Integer 和 Character&#xff0c; 其余基本类型的包装类…

fastdds qos:DeadlineQosPolicy

1含义DeadlineQosPolicy这种qos使用在DataWriter、DataReader、Topic。该qos用来监督数据是不是按照预期的频率进行收发。假如数据是周期性发送和接收&#xff0c;周期是固定的100ms&#xff0c;我们如果想要监督数据收发是不是按照预期的周期进行的&#xff0c;那么就可以配置…

QT-窗口类部件

Qt窗口类部件 一、窗口类部件 窗口就是没有父部件的部件&#xff0c;所以又称顶级部件。窗口类主要包括基本窗口类QWidget、对话框类QDialog和主窗口类QMainWindow三种。QObject是Qt框架中的一个核心基类&#xff0c;它提供了对象模型和信号槽机制。而QPaintDevice及其子类则提…

【CSP初赛】程序阅读3

文章目录前置知识阅读程序判断选择答案解析判断选择总结前置知识 埃氏筛素数、C 基础。 阅读程序 #include <bits/stdc.h> using namespace std; int main(){int a1[51] {0};int i,j,t,t2,n 50;for(i 2;i<sqrt(n);i){if(a1[i] 0){t2 n/i;for(j 2;j<t2;j) …

【ESP32-IDF】高级外设开发4:SPI

系列文章目录 持续更新中… 文章目录系列文章目录前言一、SPI概述1.主要功能2.SPI控制器架构3.SPI通信模式4.SPI数据帧与事务5.DMA与传输性能6.中断与驱动事件二、SPI类型定义及相关API三、SPI示例程序总结前言 在嵌入式开发中&#xff0c;SPI&#xff08;串行外设接口&#…

遥感机器学习入门实战教程|Sklearn案例⑧:评估指标(metrics)全解析

很多同学问&#xff1a;“模型好不好&#xff0c;怎么量化&#xff1f;” 本篇系统梳理 sklearn.metrics 中常用且“够用”的多分类指标&#xff0c;并给出一段可直接运行的示例代码&#xff0c;覆盖&#xff1a;准确率、宏/微/加权 F1、Kappa、MCC、混淆矩阵&#xff08;计数/…

【Bluedroid】深入解析A2DP SBC编码器初始化(a2dp_sbc_encoder_init)

SBC(Subband Coding)作为蓝牙 A2DP 协议的标准编解码器,其编码器的初始化与参数配置直接影响音频传输的音质、效率与兼容性。本文基于Andoird A2DP 协议栈源码,系统剖析 SBC 编码器的初始化流程,包括核心参数(比特池、采样率、声道模式等)的解析、计算与动态调整逻辑,以…

linux shell测试函数

在 C 语言中&#xff0c;int main(int argc, char *argv[])是程序的入口函数&#xff0c;而​​在 main函数中调用专门的测试逻辑&#xff08;如测试函数&#xff09;​​的程序结构&#xff0c;通常被称为​​测试程序&#xff08;Test Program&#xff09;​​或​​测试驱动…

【Java SE】抽象类、接口与Object类

文章目录一、 抽象类&#xff08;Abstract Class&#xff09;1.1 什么是抽象类&#xff1f;1.2 抽象类的语法1.2.1 定义抽象类1.2.2 继承抽象类1.3 抽象类的特性1.3.1 不能直接实例化1.3.2 抽象方法的限制1.3.3 抽象类可以包含构造方法1.3.4 抽象类不一定包含抽象方法1.3.5 抽象…

Autodl 创建新虚拟环境 python3.9

问题&#xff1a;本人在autodl上保存的环境因为很长时间没有开机&#xff0c;autodl竟然给我删除了。后来看了官网的介绍我才发现&#xff0c;原来15天不开机&#xff0c;autodl就会自动释放实例。 因此&#xff0c;我就自己重新选了一个虚拟环境&#xff0c;从头开始配置。 GP…

应急响应靶机-WindowsServer2022挖矿事件

依旧手痒开局&#xff0c;知攻善防实验室的原创靶机 https://mp.weixin.qq.com/s/URrNHvQSnFKOyefHKXKjQQ 相关账户密码&#xff1a; Administrator/zgsf123 注意&#xff1a;做个原始快照&#xff08;方便日后复习&#xff09;&#xff0c;安装VMware tool&#xff08;安装后图…