linux 下c内存管理,linux-C基础系列-内存管理(动态内存分配).md

动态内存分配概述

C语言中的一切操作都是基于内存的,变量和数组都是内存的别名,如何分配这个内存由编译器在变异期间决定的。

如定义数组时必须指定数组的长度,因此数组长度是在编译期就必须确定。

但是某些时候程序在运行中,可能需要使用一些额外的内存空间。

malloc和free

malloc所分配的内存是一块连续的内存,以字节为单位,并且不带任何的类型信息。

free用于将动态内存归还系统。其原型如下:

void *malloc(size_t size);

void free(void *p);

注意:

malloc实际分配的内存可能会比请求的稍多一点,但不能依赖于这一点;

当请求的动态内存无法满足时malloc返回NULL;

当free的参数为NULL时,函数直接返回。

因此无论如何使用malloc时必须检查返回值是否可用。

calloc和realloc

calloc与realloc类似,都可用于内存申请。原型如下:

void * calloc(size_t num,size_t size);

参数:

num 需要申请的内存个数

size 每个内存块的大小

* 为NULL申请失败,非NULL申请成功,其总空间为num*size。

void * realloc(void *p,size_t new_size);

参数:

p 原内存空间

new_size 所需新的内存空间

返回值:

为NULL申请失败,非NULL申请成功。

由上可知calloc和realloc均可返回申请的内存信息,与malloc相同使用前需要检查返回值是否可用。

与malloc不同,calloc返回的内存将被初始化为0,而realloc则是用于修改原已分配的内存大小,因此使用realloc的返回值即为新分配的内存空间,当第一个参数为NULL时,则realloc等价于malloc。

示例如下:

#include

#include

#include

#include

#include

#include

int main(void)

{

int i;

int *pi = (int*)malloc(5*sizeof(int));

short *ps = (short*)calloc(5,sizeof(short));

assert(pi&&ps);

for(i = 0;i < 5;i++){

printf("pi[%d] = %d,ps[%d] = %d\n",i,pi[i],i,ps[i]);

}

pi = (int*)realloc(pi,10*sizeof(int));

if(NULL == pi){

free(pi);

free(ps);

perror("realloc\n");

exit(EXIT_FAILURE);

}

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

printf("pi[%d] = %d\n",i,pi[i]);

}

free(pi);

free(ps);

return 0;

}

由上可知动态内存分配是C语言中的强大功能,只须能够在需要的时候动态的申请内存。

总结:

malloc单纯的从系统中申请固定字节的内存;

calloc能以某种类型或指定单位大小来申请内存,并初始化为0;

realloc用于重置内存大小。

那么问题来了

malloc(0)的返回值是啥?

一般来说,malloc如返回值为NULL则malloc失败,否则将会返回一个有效的内存地址,可以被free掉,而这个有效的内存地址的有效内存空间为0,因为空间为0的内存空间也是一个内存对象,与NULL的含义不同。

calloc(0,0)的返回值又是啥?

同malloc。

realloc(p,0)呢?

同free。

email: MingruiZhou@outlook.com

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值