c语言中,malloc和free是啥意思?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言中,malloc和free是啥意思?相关的知识,希望对你有一定的参考价值。

c语言中,malloc和free是什么意思?
请说的具体点啊!

属于内存管理的两个函数,malloc是申请内存的,free是释放内存的。

1、malloc一般用法:

int *t=NULL;

t=(int *)malloc(sizeof(int));

也可以在sizeof前面加上一个'n*'这就成了一个动态分配数组的方法。

2、free一般用法:

int *t=NULL;

t=(int *)malloc(sizeof(int));

free(t);

这样t所指的空间就被释放掉了。

扩展资料:

malloc函数定义

其函数原型为void *malloc(unsigned int size);其作用是在内存的动态存储区中分配一个长度为size的连续空间。此函数的返回值是分配区域的起始地址,或者说,此函数是一个指针型函数,返回的指针指向该分配域的开头位置。

如果分配成功则返回指向被分配内存的指针(此存储区中的初始值不确定),否则返回空指针NULL。当内存不再使用时,应使用free()函数将内存块释放。

参考资料来源:百度百科-malloc函数

参考资料来源:百度百科-free()

参考技术A

malloc和free是C语言中申请内存空间与释放内存空间的函数。


函数原型:void *malloc(unsigned int size);

功       能:在内存的动态存储区中分配一个长度为size的连续空间。

返  回 值:指向所分配的连续存储域的起始地址的指针,若失败,返回NULL


函数原型:void free(void *p);

功       能:释放指针p所指向的内存区

返  回 值:无


举例如下:

int *p;  // 定义一个int类型的指针
p = (int *)malloc(4);  // 分配4个连续的内存单元给指针p
free(p);  // 释放指针p所指向的内存单元

参考技术B 他们内存管理的两个函数,malloc是申请内存的,free是释放内存的

c语言的核心,一个是指针,一个就是内存管理。
参考技术C malloc是动态分配空间的意思。
一般用法
int *t=NULL;
t=(int *)malloc(sizeof(int));
也可以在sizeof前面加上一个'n*'这就成了一个动态分配数组的方法。
free是释放空间的意思。
一般用法:
int *t=NULL;
t=(int *)malloc(sizeof(int));
free(t);
这样t所指的空间就被释放掉了。
参考技术D 动态申请空间,后面的是释放空间
前面是比如*p=(void*)malloc(sizeof());
free(p);
申请要是不释放的就会占用内存的使用,记住都是在堆里面申请,不是栈

数据结构-堆栈动态存储

new/delete 和 malloc/free 的关系

C语言中利用库函数malloc和free来分配和撤销内存空间的。

C++提供了较简便而功能较强的运算符new和delete来取代malloc和free函数。

注意: new和delete是运算符,不是函数,因此执行效率高。

虽然为了与C语言兼容,C++仍保留malloc和free函数,但建议用户不用malloc和free函数,而用new和delete运算符。

 

堆和栈的区别

  1、管理方式不同;

  2、空间大小不同;

  3、能否产生碎片不同;

  4、生长方向不同;

  5、分配方式不同;

  6、分配效率不同;

  管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制;对于堆来说,释放工作由程序员控制,容易产生memory leak。

  空间大小:一般来讲在 32 位系统下,堆内存可以达到4G的空间,从这个角度来看堆内存几乎是没有什么限制的。但是对于栈来讲,一般都是有一定的空间大小的,例如,在VC6下面,默认的栈空间大小是1M(好像是,记不清楚了)。当然,我们可以修改:打开工程,依次操作菜单如下:Project->Setting->Link,在 Category 中选中 Output,然后在 Reserve 中设定堆栈的最大值和 commit。注意:reserve 最小值为 4Byte;commit 是保留在虚拟内存的页文件里面,它设置的较大会使栈开辟较大的值,可能增加内存的开销和启动时间。

  碎片问题:对于堆来讲,频繁的 new/delete 势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低。对于栈来讲,则不会存在这个问题,因为栈是先进后出的队列,他们是如此的一一对应,以至于永远都不可能有一个内存块从栈中间弹出,在他弹出之前,在他上面的后进的栈内容已经被弹出,详细的可以参考数据结构,这里我们就不再一一讨论了。

  生长方向:对于堆来讲,生长方向是向上的,也就是向着内存地址增加的方向;对于栈来讲,它的生长方向是向下的,是向着内存地址减小的方向增长。

  分配方式:堆都是动态分配的,没有静态分配的堆。栈有2种分配方式:静态分配和动态分配。静态分配是编译器完成的,比如局部变量的分配。动态分配由 malloc 函数进行分配,但是栈的动态分配和堆是不同的,他的动态分配是由编译器进行释放,无需我们手工实现。

  分配效率:栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。堆则是 C/C++ 函数库提供的,它的机制是很复杂的,例如为了分配一块内存,库函数会按照一定的算法(具体的算法可以参考数据结构/操作系统)在堆内存中搜索可用的足够大小的空间,如果没有足够大小的空间(可能是由于内存碎片太多),就有可能调用系统功能去增加程序数据段的内存空间,这样就有机会分到足够大小的内存,然后进行返回。显然,堆的效率比栈要低得多。

  从这里我们可以看到,堆和栈相比,由于大量 new/delete 的使用,容易造成大量的内存碎片;由于没有专门的系统支持,效率很低;由于可能引发用户态和核心态的切换,内存的申请,代价变得更加昂贵。所以栈在程序中是应用最广泛的,就算是函数的调用也利用栈去完成,函数调用过程中的参数,返回地址,EBP 和局部变量都采用栈的方式存放。所以,我们推荐大家尽量用栈,而不是用堆。

 

参考链接:

http://www.cnblogs.com/daocaoren/archive/2011/06/29/2092957.html

http://c.biancheng.net/cpp/biancheng/view/175.html 

以上是关于c语言中,malloc和free是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

c语言中malloc是啥?怎么用?

malloc函数实现的功能是啥?

C语言,realloc动态内存申请,出现报错double free or corruption (!prev)

C语言中malloc函数的使用方法是啥?

关于C语言free函数的问题

C语言中free掉一段空间后为啥还要使用NULL