首页 > 系统相关 >动态内存分配复习

动态内存分配复习

时间:2023-05-24 20:35:30浏览次数:64  
标签:malloc 函数 realloc 内存 动态内存 calloc size 分配 复习

动态内存分配复习

为什么要使用动态内存分配:

在声明数组时,必须用一个编译常量指定数组长度,但是,数组的长度往往只有在运行的时候才能被确定,这是因为它所需要的内存空间取决于输入数据,但是容易浪费空间,又或者容易溢出

malloc和free:

malloc执行动态内存分配,free执行释放内存,当使用malloc函数时,malloc从内存池中提取一块合适的内存,并向程序返回一个指向该内存的指针,但此时这块内存并没有进行初始化,如果想要对内存进行初始化,可以考虑使用calloc函数,当调用free函数时,会把提取的内存放回内存池中

void *malloc(size_t size);
void  free(void*pointer);

以上两个为malloc和free的函数原型

malloc所分配的是一块连续的内存,而且其分配的内存实际上会比请求的多

如果系统内存不足或者无法满足malloc的内存需求,则会返回NULL,因此使用malloc函数需要检查是否成功

free的参数必须是NULL,或者是malloc、realloc、calloc函数的返回值

calloc和realloc

void *calloc(size_t num_elements,size_t element_size);
void  realloc(void* ptr,size_t  new_size);

calloc函数与malloc函数类似,但有两点区别,首先,calloc函数会在返回指向内存的指针的时候,将其初始化,但是这个初始化过程需要花费一定的时间,第二点是calloc函数的参数不同,calloc函数参数是所需元素数量以及元素大小

realloc:再次分配内存大小,它可以扩大或者缩小malloc所取得的内存空间,但是如果是扩大的时候,增大的部分不会进行初始化,缩小的化,仅将尾部部分去掉,剩余内容不变,如果原先内存空间大小不可改变,那么realloc函数就会新开辟一个内存空间,然后将原内存空间内容复制进来,所以调用realloc函数时,要创建一个新的指针来接受realloc函数的返回值,最后如果realloc的第一个参数是NULL,那么其作用和工作流程和malloc函数一样

使用动态分配的内存

int *pi;
pi=malloc(100);//分配了100字节,并返回了指向有100字节的内存空间的指针
pi=malloc(25*sizeof(int));//因为pi为整数类型,所以实质为有25个整数的整数数组
int* pi2=pi;
for(int i=0;i<25;i++)
    pi2++=0;
for(int i=0;i<25;i++)
    pi[i]=0;

 

标签:malloc,函数,realloc,内存,动态内存,calloc,size,分配,复习
From: https://www.cnblogs.com/alexlance/p/17429406.html

相关文章

  • 防止Cannot allocate memory(无法分配内存)
    防止Cannotallocatememory(无法分配内存)值为不超过总内存的1%即可,我这里设置的是512M,min_free_kbytes表示强制Linux系统最低保留的空闲内存(Kbytes),如果系统可用内存低于设定的min_free_kbytes值,则默认系统启动oom-killer或强制重启。具体行为由内核参数vm.panic_on_oo......
  • 软构复习3
    第四章数据类型与类型检验数据类型:基本数据类型:int,double,long,boolean,char;对象数据类型:String;区别: 静态类型检查:编译阶段报错,对类型的检查语法错误,类名/函数名错误,参数数目错误,参数类型错误,返回值类型错误动态类型检查:对值的报错非法的参数值,非法的返回值,越界,空指......
  • 关于软件构造第一部分(PPT0、1、3)的总结复习
     学而时习之,不亦说乎?在学习新知识的路上,我们应时时复习,总结所学知识,归纳吸收以建立自己的知识体系。故此,我现在对软件构造这门课的第一部分进行一些总结 一、软件构造的多维度视图:共有三个维度:1.按阶段划分:构造时/运行时视图,2.按动态性划分:时刻/阶段视图,3.按构造对象层次划分......
  • 复习C语言小问题
    1:强制类型转换的问题2:空间配置器的原理以及作用。3:复习C语言是支持隐式类型的转换的,但是这个转换的过程比较的“简陋”只用一个赋值运算符就完事了,但是有些类型转换是比较危险的,比如静态变量强制转换位非静态变量,因为静态变量存在寄存器中,编译器取的时候是寄存器中取得,如果用指......
  • 2.5 数组分配与访问
    基本原则对于数据类型T和整型常数N,声明如下:TA[N];起始位置表示为xa。这个声明有两个效果。首先,它在内存中分配一个L·N字节的连续区域,这里L是数据类型T的大小(单位为字节)。其次,它引入了标识符A,可以用A来作为指向数组开头的指针,这个指针的值就是xa。可以用0~N-1的整数索引来访......
  • []复习]cityengine2019/2022导入shp数据生成福田区建筑群
    时间是一把杀猪刀和人工智能比起来我太弱了.很无助.无法给自己升级系统.cityengine2019目前载入那种地区线上数据是行不通了,2022可以整一个邮箱试用一个月.https://www.esri.com/zh-cn/arcgis/products/arcgis-cityengine/trial/professionals我整了一个万能无线邮箱,无法注册,......
  • 第一章:复习与引申
    第一章:复习与引申1.关于矩阵秩的常见性质2.关于矩阵等价的常见性质3.关于向量组的极大线性无关组和秩......
  • C初级指针复习
    C初级指针复习:内存:内存中的每一个位置都由一个独一无二的地址标识每一个内存位置都包含一个值值和类型:不能简单地通过检查一个值的位来判断它的类型,为了判断值的类型(以及它的值),必须观察程序中这个值的使用方式,值的类型并非值本身所固有的一种特性,而是取决于它的使用方式NULL......
  • 软构复习2
    第二章 测试优先的编程测试&debug测试目标:证错  debug:识别错误并改正 测试等级:单元测试:函数级别;集成测试:多个类、包、组件、子系统系统测试:系统 静态测试&动态测试:靠眼睛看&撸起袖子使劲干静态测试:没有执行程序的情况下,检查源代码、语法和数据流动态测试:用给定的......
  • 软件构造复习(一)
    最近在复习软件构造,知识点感觉比较多,有些记不住的就在这里写一下以便回顾,如果有幸能帮到别人那就更好了。测试、异常、健壮性测试测试的等级按被测试部分的规模分为单元测试、集成测试、系统测试、验收测试回归测试:一旦程序被修改,重新执行之前的所有测试 黑盒测试/白盒测......