MENU

malloc|动态内存分配到底是什么

February 15, 2019 • 我爱学习

        在进行“数据结构与算法分析”这一课程的时候,经常能看到一个函数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,因为他使用的是是堆内存,只要内存有那么多的连续空间就可以
Last Modified: September 8, 2021