社区
C语言
帖子详情
请问局部变量是保存在哪里的??
ideal2004
2005-11-10 09:02:08
请问局部变量是保存在哪里的??堆和栈有什么区别?
...全文
4256
12
打赏
收藏
请问局部变量是保存在哪里的??
请问局部变量是保存在哪里的??堆和栈有什么区别?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
12 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
qong
2005-11-10
打赏
举报
回复
stack
wuwen19
2005-11-10
打赏
举报
回复
局部变量在栈空间
qinxiaolin
2005-11-10
打赏
举报
回复
操作系统给程序运行的内存非了4个区域:
1 代码区:顾名思义就是存放运行的代码的
2 全局数据区: 存放全局数据和静态数据以及常量.
3 栈区 函数调用时的返回地址,参数压栈,局部变量,返回数据等都存放在栈区.
4 堆区,存放程序动态分配的内存(new,malloc等函数分配的)
栈内存是由系统自己分配和释放的,而堆内存要由程序员自己全全控制的,否则会出现内存泄露.
lzp229
2005-11-10
打赏
举报
回复
保存在栈里
hbvanguard
2005-11-10
打赏
举报
回复
局部变量保存在栈内存区;
栈内存区的地址是连续的,由系统控制速度较快而
堆内存区的地址是不连续的,它是系统将空闲内存块链接起来的链表,
用户用new/malloc请求分配时,找到第一个满足大小要求的块从链表中删除此节点,
然后分给用户,没有栈内存速度快,但是很灵活。
goodluckyxl
2005-11-10
打赏
举报
回复
局部变量在栈空间
qmxy
2005-11-10
打赏
举报
回复
同意楼上
fiftymetre
2005-11-10
打赏
举报
回复
局部变量保存在栈里
栈和堆的区别是
栈是系统根据变量大小自动分配空间的
堆是你用new,malloc等手动分配空间的
asker100
2005-11-10
打赏
举报
回复
m
Grubby_c
2005-11-10
打赏
举报
回复
堆和栈的区别
一般认为在c中分为这几个存储区
1栈 - 有编译器自动分配释放
2堆 - 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收
3全局区(静态区),全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块
区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。
- 程序结束释放
4另外还有一个专门放常量的地方。 - 程序结束释放
在函数体中定义的变量通常是在栈上,用malloc, calloc, realloc等分配内存的函数分配得到的就是
在堆上。在所有函数体外定义的是全局量,加了static修饰符后不管在哪里都存放在全局区(静态
区),在所有函数体外定义的static变量表示在该文件中有效,不能extern到别的文件用,在函数体内
定义的static表示只在该函数体内有效。另外,函数中的"adgfdf"这样的字符串存放在常量区。
比如:
代码:
int a = 0; //全局初始化区
char *p1; //全局未初始化区
main()
{
int b; //栈
char s[] = "abc"; //栈
char *p2; //栈
char *p3 = "123456"; //123456\0在常量区,p3在栈上。
static int c = 0; //全局(静态)初始化区
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);
//分配得来得10和20字节的区域就在堆区。
strcpy(p1, "123456");
//123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一块。
}
还有就是函数调用时会在栈上有一系列的保留现场及传递参数的操作。
栈的空间大小有限定,vc的缺省是2M。栈不够用的情况一般是程序中分配了大量数组和递归函数层次太
深。有一点必须知道,当一个函数调用完返回后它会释放该函数中所有的栈空间。栈是由编译器自动管
理的,不用你操心。
堆是动态分配内存的,并且你可以分配使用很大的内存。但是用不好会产生内存泄漏。
并且频繁地malloc和free会产生内存碎片(有点类似磁盘碎片),因为c分配动态内存时是寻找匹配的
内存的。而用栈则不会产生碎片。
在栈上存取数据比通过指针在堆上存取数据快些。
一般大家说的堆栈和栈是一样的,就是栈(stack),而说堆时才是堆heap.
栈是先入后出的,一般是由高地址向低地址生长。
转载的另外一篇:
堆(heap)和栈(stack)是C/C++编程不可避免会碰到的两个基本概念。首先,这两个概念都可以在讲数据
结构的书中找到,他们都是基本的数据结构,虽然栈更为简单一些。
在具体的C/C++编程框架中,这两个概念并不是并行的。对底层机器代码的研究可以揭示,栈是机器系
统提供的数据结构,而堆则是C/C++函数库提供的。
具体地说,现代计算机(串行执行机制),都直接在代码底层支持栈的数据结构。这体现在,有专门的寄
存器指向栈所在的地址,有专门的机器指令完成数据入栈出栈的操作。
这种机制的特点是效率高,支持的数据有限,一般是整数,指针,浮点数等系统直接支持的数据类型,
并不直接支持其他的数据结构。因为栈的这种特点,对栈的使用在程序中是非常频繁的。对子程序的调
用就是直接利用栈完成的。机器的call指令里隐含了把返回地址推入栈,然后跳转至子程序地址的操
作,而子程序中的ret指令则隐含从堆栈中弹出返回地址并跳转之的操作。C/C++中的自动变量是直接利
用栈的例子,这也就是为什么当函数返回时,该函数的自动变量自动失效的原因。
和栈不同,堆的数据结构并不是由系统(无论是机器系统还是操作系统)支持的,而是由函数库提供的。
基本的malloc/realloc/free函数维护了一套内部的堆数据结构。当程序使用这些函数去获得新的内存
空间时,这套函数首先试图从内部堆中寻找可用的内存空间,如果没有可以使用的内存空间,则试图利
用系统调用来动态增加程序数据段的内存大小,新分配得到的空间首先被组织进内部堆中去,然后再以
适当的形式返回给调用者。当程序释放分配的内存空间时,这片内存空间被返回内部堆结构中,可能会
被适当的处理(比如和其他空闲空间合并成更大的空闲空间),以更适合下一次内存分配申请。这套复杂
的分配机制实际上相当于一个内存分配的缓冲池(Cache),使用这套机制有如下若干原因:
1. 系统调用可能不支持任意大小的内存分配。有些系统的系统调用只支持固定大小及其倍数的内存请
求(按页分配);这样的话对于大量的小内存分类来说会造成浪费。
2. 系统调用申请内存可能是代价昂贵的。系统调用可能涉及用户态和核心态的转换。
3. 没有管理的内存分配在大量复杂内存的分配释放操作下很容易造成内存碎片。
堆和栈的对比
从以上知识可知,栈是系统提供的功能,特点是快速高效,缺点是有限制,数据不灵活;而栈是函数库
提供的功能,特点是灵活方便,数据适应面广泛,但是效率有一定降低。栈是系统数据结构,对于进
程/线程是唯一的;堆是函数库内部数据结构,不一定唯一。不同堆分配的内存无法互相操作。栈空间
分静态分配和动态分配两种。静态分配是编译器完成的,比如自动变量(auto)的分配。动态分配由
alloca函数完成。栈的动态分配无需释放(是自动的),也就没有释放函数。为可移植的程序起见,栈的
动态分配操作是不被鼓励的!堆空间的分配总是动态的,虽然程序结束时所有的数据空间都会被释放回
系统,但是精确的申请内存/释放内存匹配是良好程序的基本要素。
+--------------------------------------------+ 高地址
| | <- 命令行参数和环境变量
| |
|--------------------------------------------| <------- 栈底
| 栈 |
| | |
| v |
|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~| <------- 栈顶
| |
| |
|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|
| ^ |
| | |
| 堆 |
|--------------------------------------------|
| 未初始化的数据 | <-------- 由exec()赋初值0
|--------------------------------------------|
| 初始化的数据 |---\
|--------------------------------------------| \ exec()从程序文件中读
| 正文 | / 到(硬盘上的文件)
| |---/
+--------------------------------------------+ 低地址
Caps77
2005-11-10
打赏
举报
回复
先搞清楚为什么要有堆,为什么要有栈就容易理解了
ywchen2000
2005-11-10
打赏
举报
回复
操作系统给程序运行的内存非了4个区域:
1 代码区:顾名思义就是存放运行的代码的
2 全局数据区: 存放全局数据和静态数据以及常量.
3 栈区 函数调用时的返回地址,参数压栈,局部变量,返回数据等都存放在栈区.
4 堆区,存放程序动态分配的内存(new,malloc等函数分配的)
栈内存是由系统自己分配和释放的,而堆内存要由程序员自己全全控制的,否则会出现内存泄露.
vector
保存
局部变量
和指向
局部变量
的指针区别
一、结论 vector
保存
局部变量
:可以,因为在vector上创建对象也是在堆上; vector
保存
指向
局部变量
的指针:不可以,因为
局部变量
离开作用域后,就会释放,指向
局部变量
的指针会指向未知的地址空间,指向的内容未知。 demo1:验证vector即使
局部变量
也是堆上上分配。 结果:返回的vector中
保存
的
局部变量
地址没有变化。 #include <iostream> #include <vector> using namespace std; // 返回一个vector变量,
汇编中esp和ebp在函数栈空间的
保存
和变化 call的参数和
局部变量
的关系详解
目录espebp esp call执行跳入子程序以后栈顶寄存器,一直指向栈顶 ebp call执行过跳入子程序以后,一直指向栈底 看下面例子模拟一个有2个参数的函数.例如函数参数1是 5, 参数2是6 push 6 //参数2 push 5 //参数1 call 子程序地址 //子程序开始以后的栈的内容操作 push eip// 这里栈内显示是:"返回到" 因为call语句执行时候的把eip压入栈,这样当子程序结束的时候可以通过retn语句的时候 找到call下面的语句,就是通过这个eip找到的.因为re
JS | 动态生成函数 和
保存
局部变量
JavaScript中动态生成函数和闭包是重要特性。动态生成函数通过Function构造函数或高阶函数在运行时创建新函数,常用于回调、事件处理和异步编程。闭包使函数能记住创建时的作用域变量,实现数据封装和状态保持,广泛应用于计数器、私有数据管理等功能。两者结合为函数式编程、事件驱动和异步操作提供了灵活解决方案,是JavaScript编程的核心技术之一。
前台多人编辑时怎么让每个人
保存
刷新都互不干扰??
🏆本文收录于专栏,主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家!持续更新中,up!up!up!!
ucos如何
保存
局部变量
到任务堆栈中
学习ucos好长一段时间,一直没明白在os中任务是怎么
保存
局部变量
在自己的栈中。今天终于弄明白了。 1.没有OS时,任务如何
保存
局部变量
在我的知识体系里,我一直以为单片机中就只有一个栈,以stm32为例,在启动文件中有怎么一段: ; Amount of memory (in bytes) allocated for Stack ; Tailor this value to yo...
C语言
70,039
社区成员
243,246
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章