内存操作函数: malloc

时间:2022-10-28 20:09:35
函数 malloc:  void *malloc(size_t size);  //在内存块获取区块。
头文件 : malloc.h

返回值: 如果分配成功则返回指向被分配内存的指针(此存储区中的初始值不确定),否则返回空指针NULL。

内存释放:当内存不再使用时,应使用free()函数将内存块释放。函数返回的指针一定要适当对齐,使其可以用于任何数据对象。

注意:在使用上,malloc 和 new 至少有两个不同: new 返回指定类型的指针,并且可以自动计算所需要大小。比如:
int*p;
p=new int;
//返回类型为int*类型(整数型指针),分配大小为sizeof(int);
而 malloc 则必须要由我们计算字节数,并且在返回后强行转换为实际类型的指针。
int*p;
p=(int*)malloc(sizeof(int)*128);
 
工作机制:
 malloc函数的实质体现在,它有一个将可用的内存块连接为一个长长的列表的所谓空闲链表。调用malloc函数时,它沿连接表寻找一个大到足以满足用户请求所需要的内存块。
 然后,将该内存块一分为二(一块的大小与用户请求的大小相等,另一块的大小就是剩下的字节)。接下来,将分配给用户的那块内存传给用户,并将剩下的那块(如果有的话)返回到连接表上。
 调用free函数时,它将用户释放的内存块连接到空闲链上。到最后,空闲链会被切成很多的小内存片段,如果这时用户申请一个大的内存片段,那么空闲链上可能没有可以满足用户要求的片段了。
 于是,malloc函数请求延时,并开始在空闲链上翻箱倒柜地检查各内存片段,对它们进行整理,将相邻的小空闲块合并成较大的内存块。如果无法获得符合要求的内存块,malloc函数会返回NULL指针,

 因此在调用malloc动态申请内存块时,一定要进行返回值的判断。


//正常程序:
#include <stdio.h>//头文件
#include <stdlib.h>
#include <malloc.h>
#include<string>

using namespace std;

typedef struct data_type{
int age;
char name[20];
}data;


void main()
{
data* bob=NULL;
bob=(data*)malloc(sizeof(data));
if(bob!=NULL) //必须对返回值进行检查是否分配成功
{
bob->age=22;
strcpy(bob->name,"Robert");
printf("%sis%dyearsold\n",bob->name,bob->age);
}
else
{
printf("mallocerror!\n");
exit(-1);
}
free(bob);
bob=NULL;//释放指针所指内存后,记得把指针赋值为NULL;
}




//内存泄漏实例 例1: 对malloc申请之后没有检测返回值;
#include<stdio.h>
#include<malloc.h> // malloc()函数被包含在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;
}