社区
C语言
帖子详情
请问局部变量是保存在哪里的??
ideal2004
2005-11-10 09:02:08
请问局部变量是保存在哪里的??堆和栈有什么区别?
...全文
4285
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等函数分配的)
栈内存是由系统自己分配和释放的,而堆内存要由程序员自己全全控制的,否则会出现内存泄露.
如何打造数据科学团队,你想知道的都在这里
原文:DoingData Science Right — Your Most Common Questions Answered作者:Jeremy Stanley, Da...
细数数据科学团队中的十大关键角色
作者 Cassie Kozyrkov 编译 Mika 本文为 CDA 数据分析师原创作品,转载需授权 应用数据科学是一项高度跨学科的团队工作,需要用多样性的角度看问题。事实上,比起专业知识和经验,观点和态度的重要性也不容小觑。以下是我对数据科学团队构成的看法。 数据工程师 首先在进行数据分析之前,我们需要获取数据。如果是处理小型数据集,数据工程则有点类似在电子表格...
新任经理如何打造高效数据科学团队指南
原文:towardsdatascience.com/a-new-managers-guide-to-high-performing-data-science-teams-1bac9f010f66对于新的数据科学经理来说,管理一个团队可能很困难。领导职责往往伴随着陡峭的学习曲线。然而,通过专注于建立一个支持性、有抱负和团结的团队环境,你可以将团队的表现提升到新的高度。在这篇文章中,我将分享我在领导一个由八人组成的数据科学团队时学到的六个最重要的经验教训,强调这些见解如何帮助将任何团队转变为高效团队。
AI技术内参133-职场话题:当数据科学家遇见产品团队
我们在之前的分享中已经聊了数据科学家应该具备的基本能力,主要是希望从机器学习、统计知识、系统知识等方面给你一个完整的基本知识框架。然后我们聊了一些数据科学家的高阶能力,主要是能够通过分析产品、建立产品的评估体系以及对产品的长短期目标进行建模来系统性地提升产品性能。今天我们就把话题从数据科学家和人工智能算法工程师自身的修养和提升,扩展到一个更大的范围,那就是在职场中必然会遇到的发展和协作问题,我们来聊聊数据科学家和产品团队的关系这个话题。
打造高效提示团队,提示工程架构师的成功密码
不同的业务场景,指标不同。场景核心指标说明客服人工转接率、用户满意度转接率越低,说明AI解决问题的能力越强;满意度越高,说明用户体验越好内容生成内容通过率、人工修改时间通过率越高,说明生成的内容符合要求;修改时间越短,说明效率越高数据分析报告准确率、生成时间准确率越高,说明分析结果可靠;生成时间越短,说明效率越高打造高效提示团队,不是“招厉害的人”,而是“用架构思维建立系统”。定方向:明确团队的定位(支持型/产品型),对齐业务目标;搭体系。
C语言
70,040
社区成员
243,237
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章