在进行“数据结构与算法分析”这一课程的时候,经常能看到一个函数malloc() ;中文名字叫做:动态内存分配。但是这个动态内存分配到底是什么,它有什么作用呢,我想把我所收集到的资料整理到这里,同时还有一些问题。
一、函数原型
首先,先来看一下malloc函数的原型:extern void *malloc(unsigned int num_bytes);
,其中,void *
的意思是:未指定变量类型的指针,所以使用时一定要进行强制类型转换。unsigned int的意思大概是一个未指定的变量类型。这个所谓的未指定的变量类型还包括自己所定义的数据类型,如结构体。
malloc函数在库函数#include <stdlib.h>
或#include <malloc.h>
。
二、实现原理
根据博客一生一世的文章,他有一个将计算机中所有可用内存块连接起来的链表,即所谓的空闲链表,当我们调用malloc()函数的时候,计算机会在这一串链表中寻找一块连续的,且大小足够满足用户需求的内存块,如果这个内存块的大小超过了用户的需求大小,计算机会将其切割为两部分,一部分是用户需求的内存大小,并将这块内存的首地址返回;另一部分重新链接在空闲链表中。
三、如何使用
函数声明:void *malloc(size_t size);
由于它的返回值是一个指针,所以当malloc函数无法找到一个合适的内存块的时候,会返回NULL。所以判断malloc的返回值也是必要的。
与malloc()函数配套使用的还有一个free()函数,其作用就是释放某个动态分配的地址,表明不再使用这块动态分配的内存了,实现把之前动态申请的内存返还给系统。就是把用户所使用的内存块重新链接在空闲链表中。
正确示例:(引自百度百科)
typedef struct data_type{
int age;
char name[20];
}data;
data*bob=NULL;
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);
}
else
{
printf("mallocerror!\n");
exit(-1);
}
free(bob);
bob=NULL;
//输出结果:Robert is 22 years old.
如果没有使用free函数可能会出现内存泄漏的情况;反面例子:
#include <stdio.h>
#include <malloc.h>
#define MAX 100000000
int main(void)
{
int *a[MAX] = {NULL};
int i;
for(i=0;i<MAX;i++)
{
a[i]=(int*)malloc(MAX);
}
return 0;
}
//malloc申请之后没有检测返回值。
四、已解决的问题
malloc函数与单纯的变量声明有什么区别,有什么好处。例如,
struct Node {
int data;
int *p;
}
struct Node node;
//与
struct Node node = (Node)malloc(Node);
//我写对了吧?因为还不是太熟。
- 之所以一般结构体使用的是栈内存,有最大1Mb的限制。一般最好要使用malloc,因为他使用的是是堆内存,只要内存有那么多的连续空间就可以