关于内存思考之二——动态分配内存

关于内存思考之二——动态分配内存

    我们都很熟悉分配内存常用的是malloc函数和new函数。但是还有其他的2个。今天没时间了,整理下小知识点,很简单。

    分配内存的函数有多个不同的原型,这些都已经集成在库函数stdlib.h中了。

函数一

void *malloc(unsigned int num_bytes);

    调用该函数,需要用户指定分配内存空间的大小。分配成功后,系统为用户分配一块内存空间,空间大小为num_bytes字节,其值为随机值。该函数的返回值是void类型的指针,该指针指向分配的这块内存。由于是void类型的,所以在使用时,需要把该指针强制转换成需要的类型。内存空间有限,如果指定的大小超过了可分配内存空间的大小,则有可能分配失败。如果分配失败,返回的则是NULL

函数二

void *calloc(unsigned num,unsigned size);

    调用该函数,同样需要用户指定相应的参数,参数包括元素的数量和每个元素的字节数,这一点不用于malloc函数。Calloc分配的内存空间大小,由num,size两个参数决定。如果分配成功,分配所得的内存空间大小为num*size字节,并且内存空间被初始化为0,或NULL。该函数返回的同样是指向这块内存的指针。如果分配失败,返回的则是NULL

函数三

void *realloc(void *ptr,size_t size);

    调用该函数,对已有的内存空间进行重新分配。Void类型的指针ptr指向已有的内存空间,size用来指定重新分配之后分配所得的整个空间大小。如果分配成功,返回指向新分配空间的指针;如果分配失败,同样返回NULL

    纵观各函数,均有返回值。如果分配成功,返回的指针指向分配的内存空间。如果分配失败,返回的则是NULL。所以,在使用前,最好判断是否分配成功,或者说必须判断是否分配成功。

    下面说下内存的释放:内存有限,分配出去的内存空间在不用时要及时回收。分配、回收配对使用。内存的回收,也成内存的释放。与动态分配内存一样,同样需要编程人员来完成。

void free(void *ptr);

    动态分配的内存使用结束后,要及时释放。调用该函数,指定需要释放的内存空间地址,即可完成释放。

    需要注意的是,内存的释放与指针之间的关系。内存释放,只是把这块内存的数据变成无效数据,而指针ptr依然指向这块内存,但是内存的数据是无效的。

    为了防止该指针在这种情况下被继续使用,释放内存后,要及时把指针指向NULL,这样的话下次使用该指针时,通过判错功能if(ptr == NULL)就可以阻止使用无效指针。也就是说,释放内存的同时,也要释放指针。同理,如果单纯的把指针指向NULL,也是不行的,释放指针并不等于释放内存。

使用时的注意事项:

    1.  使用分配内存函数的返回指针前,很有必要判断是否分配成功。

    2.  使用结束的内存,要及时释放。

   3.  内存释放后,建议把指针指向NULL

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值