零基础非科班也能掌握的C语言知识19 动态内存管理

2024-06-09 21:04

本文主要是介绍零基础非科班也能掌握的C语言知识19 动态内存管理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

动态内存管理

  • 1.为什么要有动态内存分配
  • 2.malloc和free
    • 2.1 malloc
    • 2.2 free
  • 3.calloc和realloc
    • 3.1 calloc
    • 3.2realloc
  • 4.常见的动态内存的错误
    • 4.1对NULL指针的解引用操作
    • 4.2对动态开辟空间的越界访问
    • 4.3对非动态内存开辟的空间free
    • 4.4使用free释放⼀块动态开辟内存的⼀部分
    • 4.5对同⼀块动态内存多次释放
    • 4.6动态开辟内存忘记释放(内存泄漏)
  • 5.柔性数组
    • 5.1柔性数组的特点
    • 5.2柔性数组的使用
  • 6.总结C/C++中程序内存区域划分

1.为什么要有动态内存分配

我们目前掌握的内存开辟方式仅仅是在栈上开辟一个大小固定好的空间。但是对于空间的需求,不仅仅是上述的情况。有时候我们需要的空间⼤⼩在程序运⾏的时候才能知道,那在栈上开辟空间的⽅式就不能满⾜了。(尽管我们会通过变长数组的方式开辟栈空间,但是变长数组的大小在确定后就不能改变了),我们需要让程序员⾃⼰可以申请和释放空间,因此C语言引入了动态内存开辟

2.malloc和free

2.1 malloc

C语⾔提供了⼀个动态内存开辟的函数:malloc
在这里插入图片描述

在这里插入图片描述
注意malloc的参数是size_t的类型,开辟的空间是以字节为单位的。

2.2 free

C语⾔提供了另外⼀个函数free,专⻔是⽤来做动态内存的释放和回收的,函数原型如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注意free释放了动态开辟的内存的之后,应及时将ptr置为空指针否则的话ptr将变成野指针。往往free和置为空指针是同时出现的

3.calloc和realloc

3.1 calloc

在这里插入图片描述

在这里插入图片描述
例子:
在这里插入图片描述

3.2realloc

在这里插入图片描述

在这里插入图片描述
但是动态开辟内存是可能失败的也及时说,情况二下我们开辟动态内存失败会造成原数据丢失,因此我们应该选择代码2。
在这里插入图片描述
当然在没有开辟过动态内存时我们也可以用realloc来开辟

#include<stdlib.h>
int main()
{
realloc(NULL,10);
return 0;
}

4.常见的动态内存的错误

4.1对NULL指针的解引用操作

因此开辟内存空间(可能开辟失败)后一定要判断是否返回的是一个空指针

4.2对动态开辟空间的越界访问

#include<stdlib.h>
void test()
{int i = 0;int* p = (int*)malloc(10 * sizeof(int));if (NULL == p){exit(EXIT_FAILURE);}for (i = 0; i <= 10; i++){*(p + i) = i;//当i是10的时候越界访问}free(p);
}
int main()
{test();
}

在这里插入图片描述

4.3对非动态内存开辟的空间free

#include<stdlib.h>
void test()
{int a = 10;int* p = &a;free(p);//ok?}
int main()
{test();
}

在这里插入图片描述

4.4使用free释放⼀块动态开辟内存的⼀部分

#include<stdlib.h>
void test(){int *p = (int *)malloc(100);p++;free(p);//p不再指向动态内存的起始位置}

4.5对同⼀块动态内存多次释放

#include<stdlib.h>
void test(){int *p = (int *)malloc(100);free(p);free(p);//重复释放}

4.6动态开辟内存忘记释放(内存泄漏)

#include<stdlib.h>
void test(){int *p = (int *)malloc(100);if(NULL != p){*p = 20;}}
int main(){test();while(1);}

感觉遇到这个问题是最棘手的,因为一开始程序是正常运行的。然后内存泄漏堆区占满了,程序直接崩溃了。关键这个问题还不好察觉,因此动态内存开辟一定要free并且置零

5.柔性数组

也许你从来没有听说过柔性数组(flexible array)这个概念,但是它确实是存在的。
C99 中,结构中的最后⼀个元素允许是未知⼤⼩的数组,这就叫做『柔性数组』成员。
在这里插入图片描述

5.1柔性数组的特点

在这里插入图片描述

5.2柔性数组的使用

#include<stdlib.h>
typedef struct st_type
{int i;int a[0];//柔性数组成员
}type_a;
int main()
{int i = 0;type_a* p = (type_a*)malloc(sizeof(type_a) + 100 * sizeof(int));//业务处理p->i = 100;for (i = 0; i < 100; i++){p->a[i] = i;}free(p);return 0;
}

6.总结C/C++中程序内存区域划分

在这里插入图片描述

这篇关于零基础非科班也能掌握的C语言知识19 动态内存管理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1046293

相关文章

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

sqlite3 相关知识

WAL 模式 VS 回滚模式 特性WAL 模式回滚模式(Rollback Journal)定义使用写前日志来记录变更。使用回滚日志来记录事务的所有修改。特点更高的并发性和性能;支持多读者和单写者。支持安全的事务回滚,但并发性较低。性能写入性能更好,尤其是读多写少的场景。写操作会造成较大的性能开销,尤其是在事务开始时。写入流程数据首先写入 WAL 文件,然后才从 WAL 刷新到主数据库。数据在开始

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

软考系统规划与管理师考试证书含金量高吗?

2024年软考系统规划与管理师考试报名时间节点: 报名时间:2024年上半年软考将于3月中旬陆续开始报名 考试时间:上半年5月25日到28日,下半年11月9日到12日 分数线:所有科目成绩均须达到45分以上(包括45分)方可通过考试 成绩查询:可在“中国计算机技术职业资格网”上查询软考成绩 出成绩时间:预计在11月左右 证书领取时间:一般在考试成绩公布后3~4个月,各地领取时间有所不同

安全管理体系化的智慧油站开源了。

AI视频监控平台简介 AI视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程,实现芯片、算法、应用的全流程组合,从而大大减少企业级应用约95%的开发成本。用户只需在界面上进行简单的操作,就可以实现全视频的接入及布控。摄像头管理模块用于多种终端设备、智能设备的接入及管理。平台支持包括摄像头等终端感知设备接入,为整个平台提

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

【Linux 从基础到进阶】Ansible自动化运维工具使用

Ansible自动化运维工具使用 Ansible 是一款开源的自动化运维工具,采用无代理架构(agentless),基于 SSH 连接进行管理,具有简单易用、灵活强大、可扩展性高等特点。它广泛用于服务器管理、应用部署、配置管理等任务。本文将介绍 Ansible 的安装、基本使用方法及一些实际运维场景中的应用,旨在帮助运维人员快速上手并熟练运用 Ansible。 1. Ansible的核心概念