美文网首页
linux 内存分配malloc、calloc、realloc的

linux 内存分配malloc、calloc、realloc的

作者: jernen | 来源:发表于2021-10-10 20:08 被阅读0次

1. malloc/calloc/realloc和free介绍:

1. malloc函数

malloc函数可以从堆上获得指定字节的内存空间,其函数声明如下:

void * malloc(int n);

参数释义:
n:申请空间大小(单个类型大小*总个数)

函数详述:
其中,形参n为要求分配的字节数。如果函数执行成功,malloc返回获得内存空间的首地址;如果函数执行失败,那么返回值为NULL。由于malloc函数值的类型为void型指针,因此,可以将其值类型转换后赋给任意类型指针,这样就可以通过操作该类型指针来操作从堆上获得的内存空间。
需要注意的是,malloc函数分配得到的内存空间是未初始化的。
注意:通过malloc函数得到的堆内存必须使用memset函数来初始化。

2. calloc函数

calloc函数的功能与malloc函数的功能相似,都是从堆分配内存。其函数声明如下:

void *calloc(int n,int size);

参数释义:
size:单个类型大小
n:申请的个数
注意:最后申请空间大小为: n和size相乘

函数详述:
函数返回值为void型指针。如果执行成功,函数从堆上获得size * n的字节空间,并返回该空间的首地址。如果执行失败,函数返回NULL。该函数与malloc函数的一个显著不同时是,calloc函数得到的内存空间是经过初始化的,其内容全为0。calloc函数适合为数组申请空间,可以将size设置为数组元素的空间长度,将n设置为数组的容量。

3. realloc函数

realloc函数的功能比malloc函数和calloc函数的功能更为丰富,可以实现内存分配和内存释放的功能,其函数声明如下:

void * realloc(void * p,int n);

参数释义:
p:堆上已经存在空间的地址
n:空间的大小

函数详述:
其中,指针p必须为指向堆内存空间的指针,即由malloc函数、calloc函数或realloc函数分配空间的指针。realloc函数将指针p指向的内存块的大小改变为n字节。如果n小于或等于p之前指向的空间大小,那么。保持原有状态不变。如果n大于原来p之前指向的空间大小,那么,系统将重新为p从堆上分配一块大小为n的内存空间,同时,将原来指向空间的内容依次复制到新的内存空间上,p之前指向的空间被释放。relloc函数分配的空间也是未初始化的。

注意:使用malloc函数,calloc函数和realloc函数分配的内存空间都要使用free函数或指针参数为NULL的realloc函数来释放。

2.2使用方法:

1、malloc()

头文件:stdlib.h

声明:void * malloc(int n);

含义:在堆上,分配n个字节,并返回void指针类型。

返回值:分配内存成功,返回分配的堆上存储空间的首地址;否则,返回NULL

初始化:未初始化

2、calloc()

头文件:stdlib.h

声明:void *calloc(int n, int size);

含义:在堆上,分配nsize个字节,并初始化为0,返回void 类型

返回值:同malloc() 函数

初始化:已初始化

3、recalloc()

头文件:stdlib.h

声明:void * realloc(void * p,int n);

含义:重新分配堆上的void指针p所指的空间为n个字节,同时会复制原有内容到新分配的堆上存储空间。注意,若原来的void指针p在堆上的空间不大于n个字节,则保持不变。

返回值:同malloc() 函数

初始化:未初始化

4、free()

头文件:stdlib.h

声明:void free (void * p);

含义:释放void指针p所指的堆上的空间。

返回值:无

5、memset()

头文件:string.h

声明:void * memset (void * p, int c, int n) ;

含义:对于void指针p为首地址的n个字节,将其中的每个字节设置为c。

返回值:返回指向存储区域 p 的void类型指针。

2.3malloc/calloc/realloc区别总结

相同点:

1.都是从堆上申请空间
2.都需要对返回值判空
3.都需要用户free释放
4.返回值类型相同(void*)
5.都需要类型转化
6.底层实现上是一样的,都需要开辟多余的空间,用来维护申请的空间

可以输入以下代码观测内存:

#include <stdio.h>
#include <malloc.h>
int main(){
int *p= (int *)malloc(sizeof(int )*10);
return 0;
}

不同点:

1.函数名字不同和参数类型不同。
2.calloc会对申请空间初始化,并且初始化为0,而其他两个不会。
3.malloc申请的空间必须使用memset初始化
4.realloc是对已经存在的空间进行调整,当第一个参数传入NULL的时候和malloc一样

调整分为两种情况:

a:调整的空间比原有空间大:

1.大了一点:多出来的空间小于小于下面空闲的空间;
做法:
1.直接延伸申请空间
2.返回原空间首地址**

2.大了很多:多出来的空间,大于下面空闲空间
做法:
1.重新开辟新空间
2.将旧空间的内容拷贝到新空间中
3.释放旧空间
4.返回新空间的首地址

b.调整的空间比原有空间小:

做法:
1.将原空间缩小
2 .返回旧空间首地址

原文链接:https://blog.csdn.net/qq_38810767/article/details/85265541

相关文章

网友评论

      本文标题:linux 内存分配malloc、calloc、realloc的

      本文链接:https://www.haomeiwen.com/subject/hcivwhtx.html