动态内存分配

C语言的一切操作都是基于内存的,变量和数组都是内存的别名,那么它们
的内存分配在编译器编译的时候就决定了,即我们在定义数组的时必须指		
定数组长度,这样编译器才知道给我们的数组分配多大的内存空间,进一步
说,当我们的应用程序编译出来后一共需要多少内存空间就已经确定了,某
些特定场合的需要,我们的程序的运行时需要一些额外的内存空间,动态内
存的分配和释放涉及到两个函数就是malloc和free,malloc 从内存池中分
配出一片内存,将首地址返回给应用程序,free则将分配的内存释放还给内
存池,malloc得到的内存在使用后要记得free释放掉,否则会造成内存泄 
漏,malloc所使用时以字节,为单位分配一块连 续的内存, 并且不带任何的
类型信息,malloc和free是库函数,而不是系统调用

而这里的库函数实际上也是依赖当前的操作系统,比如有的操作系统的内
存池是4字节对齐的,当我们用malloc动态去申请3字节,而操作系统给我
们返回4字节的内存空间,所以实际分配的内存可能比请求的多,但是我们
不能依赖于这种不同平台下的malloc行为,当malloc调用出错时会返回一
个NULL


malloc的参数就是需要的字节数,返回值是首地址指针,free的参
数是malloc返回的首地址指针
函数接口:

在这里插入图片描述
问题来了,那么malloc(0)会出现什么呢,
#include <stdio.h>
#include <malloc.h>
int main(int argc,char *argv)
{
int *p;
p=malloc(0);
printf(“p=%p\n”,p);
return 0;
}
编译测试
P=0x8dd1008
P保存着地址值,这说明malloc(0)是合法的,只是我们这段内存的长度为0我就无法使用了,如果我们不断向系统malloc(0),实际也会造成内核泄露,在我们上文说到malloc实际得到的内存空间可能比实际的大,这取决于平台.所以即使是malloc(0)也要free.

函数接口
在这里插入图片描述
Malloc只负责申请内存空间,并不会对内存空间做初始化,有时候这是非常不方便,于是就有了calloc,calloc就是带有类型信息,去内存池申请一片内存空间,并将其初始化为0,比如我们要去申请3个int话,我们就可以用calloc(3,sizeof(int)),得到的就是12个字节空间,realloc用于修改一个原先已经分配的内存块大小,在使用realloc之后应该使用其返回值,当第一个参数为NULL时,等价于malloc,realloc扩大的内存空间也不会初始化,realloc得到一个新的地址,将原来的内存内容复制到新的地址,保存原来的数据并将新扩大的内存空间初始化为0

代码:
在这里插入图片描述
结果:
在这里插入图片描述
通过分析结果我们可以看到,pI里面的每个元素值为0,那刚才不是说?malloc只负责申请空间但没有初始化,现在malloc得到的为什么是0呢?这只是linux下的巧合,在window上面编译运行就不会初始化为0了,也看到recalloc后指针值发生了变化,得到新的地址

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值