首页 > 系统相关 >C语言:动态内存管理的学习1

C语言:动态内存管理的学习1

时间:2024-05-23 23:55:45浏览次数:24  
标签:malloc int 申请 内存空间 C语言 学习 动态内存 空间

动态内存管理

本章重点

为什么存在动态内存分配?

动态内存函数的介绍

malloc

free

calloc

realloc

常见的动态内存错误· 几个经典的笔试题·柔性数组

一.为什么存在动态内存分配?

我们已经学到的开辟空间的方法:

int a;

int arr[100];

单个开辟空间或者连续开辟空间;

在数组的定义声明时需要写出空间的大小但是这样的方法不够灵活和方便;

比如int arr[100]当我们想要存放120组数据时空间不够也不能改变空间;

但我们存放80组数据时又存在空间的浪费;(在实际情况下不清楚空间的使用情况)

这个时候C语言就赋予了我们开辟动态内存空间能力;(可以改变内存空间);

二.动态内存函数的介绍

malloc(包含于头文件stdlib.h中)

void* malloc(size_t size):

函数用来想内存申请空间;

该函数参数size是要开辟空间的字节大小;返回一个void*指针指向开辟空间的起始位置;

为什么是void*类型的指针?

因为函数在设计的时候不知道未来使用者会拿开辟的空间存放什么类型的数据;

void* 可以接收任意类型的指针;只是在使用的时候需要强制类型转换;

函数在申请空间时理论上存在申请失败的情况:当我们的内存只有8G时使用malloc函数申请1T的空间

一定会失败;失败时返回空指针;

malloc函数的使用

#include<errno.h>

#incluae <string.h>

#include <stdlib.h>

#include<stdio.h>

int main()

{

//常规开辟内存

int arr[10] = {0};

//动态内存开辟

int* p = (int*)malloc(40);

if (p == NULL)

{

printf("%s\n", strerror(errno));//errno全局变量包含于头文件errno.h中;

return 1;

}

//使用

int i = 0;

.for (i = 0; i< 10; i++)

{

*(p + i) = i;

}

for (i = 0; i < 10; i++)

{

printf("%d ",*(p + i));

//没有free

//并不是说内存空间就不回收了

//当程序退出的时候,系统会自动回收内存空间的

//如果程序一直运行我们申请的空间没有使用也没有释放;长时间的程序运行会存在内存泄漏;

//所以相对正确的操作是:

free(p);

p=NULL;

//释放p所指向的内存空间(我们申请的内存空间一直用p来操作所以释放它就是释放我们申请 //的空间);通过监测内存空间我们发现当我们释放内存之后p仍然指向刚才的地址;

//所以可以说虽然释放了空间;其他数据可以申请该段空间;但是在后续的使用中仍然可以通过p找到

//这段空间;存在一定的危险性;所以需要p赋值NULL;
return 0;

}

malloc申请free释放这是一对配套函数尽量成对出现;

失败操作:

int* p=(int*)malloc(INT_MAX);

INT_MAX表示整形的最大值21亿多;

这个时候内存空间一定申请失败;

我们的内存空间分为栈区堆区和静态区;

我们常规的申请空间int arr[110];申请的是栈区上的空间;栈区的空间不能随意改变;

malloc函数申请的是堆区上的空间;

int main()

while (1){

malloc(1);

}

return 0;

}

上述代码会不断想内存申请空间导致电脑死机;

标签:malloc,int,申请,内存空间,C语言,学习,动态内存,空间
From: https://blog.csdn.net/dametime_/article/details/139157800

相关文章

  • Vue 3 学习笔记
    1.Vue3简介2020年9月18日,Vue.js发布版3.0版本,代号:OnePiece(n经历了:4800+次提交、40+个RFC、600+次PR、300+贡献者官方发版地址:Releasev3.0.0OnePiece·vuejs/core截止2024年5月,最新的公开版本为:3.4.271.1.【性能的提升】打包大小减少41%。初次渲染快55%,......
  • 初识c语言.1
    什么是c语言?语言?人与人交流:汉语、英语、俄语人与计算机交流——计算机语言:c\c++、JAVA、Python、GOc语言是一种通用的计算机编程语言,广泛应用于底层开发。底层软件开发:比如说买来一台电脑(硬件)要使电脑正常工作得需要操作系统(windows),而操作系统如何让硬件工作?需安装驱动(网......
  • TensorBoard相关学习
    TensorBoard是Google为TensorFlow框架开发的一个强大的可视化工具,它可以帮助用户更直观地理解、分析和调试机器学习模型的训练过程。通过TensorBoard,你可以可视化模型的结构、监控训练过程中的指标变化(如损失函数、准确率)、查看权重直方图、嵌入向量,甚至可以展示图像数据等......
  • Bash反弹shell & 搭建网页服务器 & 文件描述符学习 & ssh连接vm虚拟机 & sftp进行文件
    环境:kali:┌──(kali㉿kali)-[~/Desktop]└─$cat/proc/versionLinuxversion6.0.0-kali5-amd64([email protected])(gcc-12(Debian12.2.0-9)12.2.0,GNUld(GNUBinutilsforDebian)1.建立一个简单的链接进行nc,可以进行两个端口通信!#首先使用nc监听......
  • 应广Mini-C语言开发PMS150G
    应广Mini-C语言开发PMS150G(上)OTP单片机以消费类电子市场,价格低廉著称.今天就以应广PMS150G(1毛/片)芯片学习一下应广公司的Mini-C语言.Mini-C语言是台湾应广公司推出的自家单片机开发语言,兼容C语言,支持的语法更少更容易上手,既然是一种新的兼容语言自然要研究一下.到应广网......
  • C++基础知识学习笔记(2)
    资料来源https://www.bilibili.com/video/BV1et411b73Z/?spm_id_from=333.337.search-card.all.click&vd_source=cc561849591f6a210152150b2493f6f3简单知识点指针作用:通过指针间接访问内存可以通过指针来保存一个地址。指针所占内存空间32位操作系统,占4个字节。64位操......
  • 实验5 C语言指针应用编程
    task1_1.c#include<stdio.h>#defineN5voidinput(intx[],intn);voidoutput(intx[],intn);voidfind_min_max(intx[],intn,int*pmin,int*pmax);intmain(){inta[N];intmin,max;printf("录入%d个数据:\n",N);i......
  • K-D tree 学习笔记
    \(\text{K-Dtree}\)学习笔记\(\text{K-Dtree}\)是一种针对\(k\)维问题求解的算法,并且拥有出色的时空复杂度。思想\(\text{K-Dtree}\)本质上是一棵\(k\)维的二叉平衡树,这保证了其树高稳定在\(\logn\)附近,为求解提供了较为优异的建树模式。\(\text{K-Dtree}\)首......
  • 给大家分享一套非常棒的python机器学习课程
    给大家分享一套非常棒的python机器学习课程——《AI小天才:让小学生轻松掌握机器学习》,2024年5月完结新课,提供配套的代码+笔记+软件包下载!学完本课程,可以轻松掌握机器学习的全面应用,复杂特征工程,数据回归,分类,算法的项目实战应用,以小学生的视角和知识储备即可学会。课程名字:AI小天才......
  • 【Java学习】第19节:时间类(Date、Calendar、SimpleDateFormat)、包装类
    目录第一章Date类1.1Date概述1.2Date常用方法第二章SimpleDateFormat类2.1构造方法2.2格式规则2.3常用方法2.4练习1(初恋女友的出生日期)2.5练习2(秒杀活动)第三章Calendar类3.1概述3.2常用方法3.3get方法示例3.4set方法示例:3.5add方法示例:第......