在函数内部定义的变量,在堆栈中分配内存,系统自动开辟内存,那为什么要用MALLOC函

如题所述

函数体内定义的局部变量是auto变量,在函数调用开始时分配空间,这些空间位于栈区,函数调用结束后这些空间自动被释放。使用malloc申请得到的空间是堆区空间,不由函数机制控制,可以由程序的任何部分调用,需要手动使用free释放。之所以需要在堆内存中分配空间,是因为它可以跨函数引用,而且不需要(同样可以跨函数引用的)如全局变量、全局静态变量在进程开始后始终占用静态存储区直至进程退出,可以按需动态地分配和释放。(代价是通过指针等方式引用堆内存比栈内存中需要更多指令周期,效率要低;而且需要手动管理内存分配和回收。)
另外,相比堆内存,栈的内存一般是相当有限的,所以占用空间较大对象的管理一般都直接通过堆内存。
====
[原创回答团]

参考资料:原创

温馨提示:内容为网友见解,仅供参考
第1个回答  2010-04-09
函数内部定义的auto变量(定义变量默认为auto),在栈中开辟内存(系统自动开辟内存).函数执行完毕释放.
用malloc函数分配的空间属于堆栈区,不自动释放,必需由程序员自己释放或者程序结束回收`

关于嵌入式程序中malloc和free函数的问题。
但是对于由malloc动态分配的内存是在堆中分配,并不是你所说的也是从栈中分配,所以用malloc分配内存并不会影响SP。malloc申请的空间必须有free进行释放,在函数内申请的空间不一定需要在函数推出前释放,只要头指针没有丢失函数返回后再释放也是可以的 综上所述,你主要是把堆和栈搞混淆了,malloc申请的...

急,请问一个C语言问题
栈区 是函数调用时创建的,为函数参数变量申请空间,函数退出时释放,不用程序员参与。静态区 编译器运行时一直存在,由编译器负责分配,程序退出时释放,不用程序参与 堆区 程序根据需要用malloc创建的内存 由程序员用free释放 所以说你在子函数里面定义的变量以属于栈区 由系统自动在函数退出时释放 ...

用C语言分配开辟内存问题
定义的局部变量,在程序编译的时候,编译器会建立函数栈,然后局部变量存放于栈中,windows系统中,栈大小为2M ,其他楼上都说了 下一个:new和malloc()分配的空间都是在堆区,堆你就可以随意申请了,系统会在系统空闲的链表中找出你要申请空间的大小,标志为已经使用了,然后就会给你用 在申请空间...

C语言 malloc()函数 分配内存空间尺寸的问题
malloc是给指针变量分配内存空间的函数命令 正确使用:分配的空间要能保证容下你想存储的数据,不要和机器逗着玩(分配0空间,或少于自己实际需要的空间),如你上面的操作,表面上你程序运行没有问题,可实际上你占用了别人的地盘,只是当前你很幸运没有使程序出现问题,但不保证一定不出问题!!不再使...

堆栈理论知识
堆栈理论知识 堆栈和堆是程序内存管理的两种基本方式。首先,栈(Stack)的申请是由系统自动进行的。例如,在函数中声明的局部变量,如'int b;',系统会在栈中为其分配内存。而在C语言中,如'p1 = (char *)malloc(10);',或在C++中用'p2 = new char[20];',虽然p1和p2本身在栈中,但内存...

求C语言编程题
17.在函数内部定义的变量(静态变量、寄存器变量等特殊变量除外)的内存是在栈内存中,所以在定义函数内部的变量的时候,一定要保证栈不能够溢出。如果临时变量 占用空间较大,应该使用内存申请的方式,这样该变量指向的内存就是在堆内存中了。 A. 正确 B. 错误答案:A18.局部变量可以和全局变量重名,编译的时候不会出现...

C语言,什么时候需要开辟空间
其实写一个函数,开头的声明变量或数组就是在开辟空间,所以只要写代码,开辟空间的事肯定就少不了。但你这里说的我想应该是指“动态开辟空间”。动态开辟空间一般在以下情况下进行:编程时不知道需要多大的空间,要在程序运行时由用户输入大小或计算出所需大小;一些数据量太大,栈区放不下,需要创建在...

堆栈 在C语言中看到的,是什么东西啊.有什么作用啊,怎么用?
对于堆来与,可以使用malloc、realloc语句进行申请空间,通常情况下申请得到的是堆空间中的一块区域,而通常情况下定义的数组也会使用堆空间。通常情况下,由代码申请得到的空间需要使用对应的代码进行释放,否则会造成内存泄漏。对于栈来与,主函数在调用子函数之前,系统会自动将主函数所使用的寄存器参数等...

为什么要用堆栈,什么是堆栈
简单的可以理解为:heap:是由malloc之类函数分配的空间所在地。地址是由低向高增长的。stack:是自动分配变量,以及函数调用的时候所使用的一些空间。地址是由高向低减少的。预备知识—程序的内存分配 一个由c\/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,...

堆栈与堆有什么区别?
1. 堆栈:堆栈是程序自动管理的区域,主要用于存储函数调用时的局部变量和参数,其空间分配是自动的,有明确的上下边界,整体大小有限。2. 堆:堆则由程序员通过malloc等函数动态分配空间,空间大小灵活,没有固定的大小限制,适用于需要大量内存且生命周期较长的数据。其次,堆栈与堆在地址方向上展现不同...

相似回答