关于c语言动态分配内存的知识点的总结(总结)

内存分配函数的使用(自己总结的内存分配相关的知识,部分参考网上的知识)

malloc函数是动态分配一段堆上内存,并且返回该内存的首地址,该函数不对申请的空间进行清空操作;

   malloc是一个函数,需要包含头文件才能使用,malloc 函数本身并不识别要申请的内存是什么类型,它只关心内存的总字节数必须由使用者计算字节数;

       malloc 返回值的类型是void *, 将void * 转换成所需要的指针类型。 

   动态内存申请的原理:malloc函数的实质体现在,它有一个将可用的内存块连接为一个长长的列表的所谓空闲链表。调用malloc函数时,它沿连接表寻找一个大到足以满足用户请求所需要的内存块。然后,将该内存块一分为二(一块的大小与用户请求的大小相等,另一块的大小就是剩下的字节)。接下来,将分配给用户的那块内存传给用户,并将剩下的那块(如果有的话)返回到连接表上。调用free函数时,它将用户释放的内存块连接到空闲链上。空闲链会被切成很多的小内存片段,如果这时用户申请一个大的内存片段,那么空闲链上可能没有可以满足用户要求的片段了。于是,malloc函数请求延时,并开始在空闲链上翻箱倒柜地检查各内存片段,对它们进行整理,将相邻的小空闲块合并成较大的内存块。如果无法获得符合要求的内存块,malloc函数会返回NULL指针,因此在调用malloc动态申请内存块时,一定要进行返回值的判断


2 calloc创建一个动态内存,并对这段内存空间用0进行初始化,除了具有malloc的特征之外

如果你是为字符类型或整数类型的元素分配内存,那么这些元素将保证会被初始化为零

如果你是为指针类型的元素分配内存,那么这些元素通常(但无法保证)会被初始化为空指针;

如果你是为实数类型的元素分配内存,那么这些元素可能(只在某些计算机中)会被初始化为浮点型的零。


         3 realloc函数原型extern void *realloc(void *mem_address,unsigned int newsize);意思是先在当前内存空间寻找空间,看是否满足扩展,如果现有空间之后有足够的扩展空间,就扩展。如果不满足,去别的地方重新建立一段内存空间,并将原始数据拷贝到新空间,自动释放旧空间


.        4 alloca函数使用头文件malloc.h,在栈上申请空间,用完自动释放,如果手动free会出错;alloca不具可移植性, 而且在没有传统堆栈的机器上很难实现。当它的返回值直接传入另一个函数时会带来问题,因为他分配在栈上.由于这些原因,alloca不宜使用在必须广泛移植的程序中, 不管它可能多么有用。栈内存由一个栈指针来开辟和回收,栈内存是从高地址向低地址增长的,增长时,栈指针向低地址方向移动,指针的地址值也就相应的减小;回收时,栈指针向高地址方向移动,地址值也就增加。所以栈内存的开辟和回收都只是指针的加减,由此相对于分配堆内存可以获得一定的性能提升。当前函数退出时,由于系统堆栈指针的调整,这块内存会被自动回收。


     malloccalloc realloc alloca返回的都是无类型的指针,都需要进行强制类型转换,在c中可能能通过编并运行,但是在c++中会报错,所以直接养成强转的习惯是必须的,在选择使用malloc还是calloc时,只需要考虑是否需要初始化。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值