C语言malloc的使用浅谈
参考文献:C_Free API文档
在c语言的编程中常常要对内存操作,而这对不少人来说是个不简单的问题。
最近在做作业的过程中常常看到在用到存储结构的地方常常有malloc的身影,我就在想到底什么时候什么地方该用到malloc 经过在百度和狗狗的一番搜搜之后在下的愚见总结如下:
一、使用malloc的情况
首先说明一下,由malloc动态申请的内存空间是堆式的内存空间。
而静态的内存的空间是栈式的。有关堆栈的知识请参考其他相关资料。
1. 大容量内存需求
网上说当我们需要的内存空间超过0.5兆的时候最好使用动态内存,也就是利用malloc来申请内存空间。可以这么认为,如果内存过大,就会不易管理,而malloc可以说事一个专业的内存管理者,但静态的则可以当成是一个业余的。毕竟术业有专攻。
2. 不确定内存需求
当我们需要的内存空间大小连我们自己也不知道的时候。为了不使内存空间的浪费。我们需要用到malloc函数。可以这样理解如果说静态的内存空间是一个铁盒子的话那么动态内存空间就可以看作是可伸缩的袋子,它的容量可以根据你所装物体的体积不同而定制。当然我们也可以利用静态内存,这样会有两种可能出现的结果,一是你所申请的空间不够用,程序异常。二是申请的内存过大,浪费。
我们来看在链表中情况,如果我们定义好了一个长度为十的链表之后想要在某个位置插入或删除一个节点。这个时候我们数组静态的话肯定会在数组数值的移动上花费有很大的开销。而利用malloc动态存储时就不会出现这样的情况。由于动态申请到存储空间不一定是连续的存储空间。所以当我们使用malloc申请空间时。计算机会在‘任意’可以申请到空间的地方给我们开辟需要的空间来供我们使用。新申请的空间与原来的空间只有通过指针想连接的关系物理上并一定有前后的关系。所以就不需要对原来的数据做移动操作。这样的系统开销就相对小了很多。相应的free的时候也是对“不相关”的空间进行操作。所以也不用对数据做移动操作。
3. 备注
二、如何科学使用malloc
1. 申请
calloc
语法:
#include <stdlib.h> void *calloc( size_t num, size_t size ); |
功能: 函数返回一个指向num 数组空间,每一数组元素的大小为size。如果错误发生返回NULL。
#include <stdlib.h> void *malloc( size_t size ); |
功能: 函数指向一个大小为size的空间,如果错误发生返回NULL。 存储空间的指针必须为堆,不能是栈。这样以便以后用free函数释放空间。例如:
typedef struct data_type {
int age;
char name[20];
} data;
data *bob;
bob = (data*) malloc( sizeof(data) );
if( bob != NULL ) {
bob->age = 22;
strcpy( bob->name, "Robert" );
printf( "%s is %d years old\n", bob->name, bob->age );
}
free( bob );
realloc
语法:
#include <stdlib.h> void *realloc( void *ptr, size_t size ); |
功能: 函数将ptr 对象的储存空间改变为给定的大小size。 参数size可以是任意大小,大于或小于原尺寸都可以。 返回值是指向新空间的指针,如果错误发生返回NULL。
2. 释放
free
语法:
#include <stdlib.h> void free( void *ptr ); |
功能: 函数释放指针ptr指向的空间,以供以后使用。指针ptr 必须由先前对malloc(), calloc(), realloc()的调用返回。例如:
typedef struct data_type {
int age;
char name[20];
} data;
data *willy;
willy = (data*) malloc( sizeof(willy) );
...
free( willy );