社区
C语言
帖子详情
请问局部变量是保存在哪里的??
ideal2004
2005-11-10 09:02:08
请问局部变量是保存在哪里的??堆和栈有什么区别?
...全文
4123
12
打赏
收藏
请问局部变量是保存在哪里的??
请问局部变量是保存在哪里的??堆和栈有什么区别?
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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等函数分配的)
栈内存是由系统自己分配和释放的,而堆内存要由程序员自己全全控制的,否则会出现内存泄露.
Java内存分配是怎样的?哪些区域是线程共享的?常量
保存
在什么区域?
局部变量
和成员变量呢?
一:Java内存分配是怎样的?哪些区域是线程共享的?常量
保存
在什么区域?
局部变量
和成员变量呢? 先上两个图: 线程共享:堆、方法区 注意:因为有了TLAB技术,堆内存并不是完完全全的线程共享,其eden区域中还是有一部分空间是分配给线程独享的。 线程独享:栈 常量存储在方法区的常量池 成员变量存储在堆中的对象里面,由垃圾回收器负责回收。
局部变量
的数据存在于栈内存中。栈内存中的
局部变量
随着方法的消失而消失。 栈中用来存放一些...
c语言中
局部变量
是什么,求教C语言的“
局部变量
”是什么意思? 爱问知识人
C语言全局变量和
局部变量
引子---? ?? ???变量可以在程序中三个地方说明: 函数内部、函数的参数定义中或所有的函数外部。根据所定义位置的不同, 变量可分为
局部变量
、形式参数和全程变量。从空间角度来看,变量可以分为全局变量和
局部变量
,而从时间角度来分的 可以有静态存储变量和动态存储变量之分。一。全局变量和
局部变量
1。
局部变量
他是 指在函数内部定义的变量 作用域为定义
局部变量
的函数 也就是说他只...
如何理解成员变量在堆内,
局部变量
在栈内?
成员变量在堆内存里,
局部变量
在栈内存里。(基础类型) 我有疑惑: 既然成员变量存在于对象中,对象存在于堆中,所以成员变量存在于堆中。那么按照这样的推理,
局部变量
存在于方法中,而方法存在于对象中,对象存在于堆中,那是不是可以说
局部变量
存在于堆中? 解决思想 当对象new出来,实体存在于堆,对象的成员变量已经在堆上分配空间,但对象里面的方法是没有出现的,只出现方法的声明,方法里面的
局部变量
并没有创建。...
「高并发」为什么
局部变量
是线程安全的?
当一个线程调用 Lock 接口的 lock() 方法时,它会获取一个锁对象,并将其
保存
在一个变量中。当一个线程调用 synchronized 关键字时,它会创建一个锁对象,并将其
保存
在一个变量中。是线程安全的,因为它们在内存中只被创建一次,并且在多个线程之间共享。这是因为
局部变量
在每个线程中都有一个唯一的副本,因此在任何时候都只有一个线程可以访问它们。然而,在某些情况下,如果多个线程同时访问同一个
局部变量
,可能会导致线程之间的竞争条件。”的机制,可以确保在多个线程之间共享的
局部变量
在访问时是线程安全的。
Python:
局部变量
,全局变量
局部变量
什么是
局部变量
?作用是什么? 定义在函数内部的变量,叫做
局部变量
。在不同函数内部可以有相同名字的
局部变量
,但是他们之间互不干扰。 作用:在函数内临时
保存
数据,让数据方便使用。 全局变量 什么是全局变量?作用是什么? 定义在函数外部的变量,叫做全局变量。 作用:全局范围内都可以使用的变量 总结1:在函数外边定义的变量叫做 全局变量全局变量能够在所有的函数中进行...
C语言
70,020
社区成员
243,264
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章