关于堆栈和栈,局部和全局变量

yilin54 2009-04-21 10:13:45
有以下几个问题请教下:

Q1:堆栈和栈是一个意思吧(不是数据结构中的栈)?

Q2: 栈和数据结构中的栈是类似的,他们的操作方式都是后进先出。那么堆和数据结构中的堆有什么不一样?他们有什么样的操作方式呀?

Q3:char *p1="aaa";
char p2[]="bbb";
为什么说p1是个全局的数组(即全局变量),而p2是个局部的数组。
...全文
451 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
li_shigang 2009-05-31
  • 打赏
  • 举报
回复
楼主真热情,哈哈
baihacker 2009-04-24
  • 打赏
  • 举报
回复
堆,最早在堆排序中提出,后来指废料收集存储区.
数据结构上:
堆可以有效地获取最大(小)元素.
继续扩展,可以最大,最小.
可合并.
可改变key.
等需求.
yilin54 2009-04-24
  • 打赏
  • 举报
回复
我晕死。看到大家这么热情,我就加分,没想到一加默认就100,亏大了。。。不过也开心。。。
jackyjkchen 2009-04-24
  • 打赏
  • 举报
回复
偶来晚了,不过也说一下,栈是连续的一小段内存,Vs默认1M,堆没有限制,数组存在栈里,动态分配分堆内存
yilin54 2009-04-24
  • 打赏
  • 举报
回复
这位大侠,虽然等级不高,不过给我感觉真是大侠!!!

[Quote=引用 14 楼 winysbow 的回复:]
Q1:堆栈和栈是一个意思吧(不是数据结构中的栈)?
A1: 一般,我们说堆栈的时候,其实指的就是栈而已。 所以这里说他们2个是一个意思也是对的。
不过“堆”的含义就不同了,栈是系统分配,堆是程序员分配。


Q2: 栈和数据结构中的栈是类似的,他们的操作方式都是后进先出。那么堆和数据结构中的堆有什么不一样?他们有什么样的操作方式呀?
A2:虽然字是一样的,都是“栈”,都是“堆”,但概念是不同的,楼主能…
[/Quote]
zhanghuayi_xiyou 2009-04-22
  • 打赏
  • 举报
回复
up,收藏~
winysbow 2009-04-22
  • 打赏
  • 举报
回复
Q1:堆栈和栈是一个意思吧(不是数据结构中的栈)?
A1: 一般,我们说堆栈的时候,其实指的就是栈而已。 所以这里说他们2个是一个意思也是对的。
不过“堆”的含义就不同了,栈是系统分配,堆是程序员分配。




Q2: 栈和数据结构中的栈是类似的,他们的操作方式都是后进先出。那么堆和数据结构中的堆有什么不一样?他们有什么样的操作方式呀?
A2:虽然字是一样的,都是“栈”,都是“堆”,但概念是不同的,楼主能这样联想是好的,但概念不同,这样比较其实不是很合适。

内存中的“栈”和“堆”是基于硬件而言的。进程是资源分配的单元,系统给进程分配“栈”和“堆”空间,对应于物理在内存中的地址。
这里“栈”的大小基本是固定的,看硬件的特性了,一般1M;“堆”的分配,由程序员向系统申请,只要内存足够,是没有限制的。
数据结构中的“栈”,是一个程序概念,是一个数据结构。它的构造都是由程序员定义的,实现的过程,也是有程序员编码去实现的。
你可以定义一个数组,作为一个“栈”,然后定义一些操作,去完成“栈”的功能。这些都是由你去实现的。
内存中“栈”的操作确实如数据结构中“栈”类似,先进后出,而内存中这个“栈”的操作的定义是固定的,不用你去管的,操作系统
会让它先进后出,而你自己定义的数据结构的“栈”,则需要你自己编码去实现先进后出。所以说这两者进行比较不是很合适,概念不同。
内存中,堆和栈一般位于相邻的地址段,栈内存的使用时按顺序递增或递减的(机器决定),堆内存的使用比不是严格递增或递减,这样
导致内存支离破碎。




Q3:char *p1="aaa";
char p2[]="bbb";
为什么说p1是个全局的数组(即全局变量),而p2是个局部的数组。
A3:这里楼主要分清楚两个概念,一个是变量的作用域,一个是变量的生存周期。
p1的生存周期是自它定义后,直到整个程序退出。生存周期与量在内存中的存储位置有关,p1指向字符串常量,存放在静态存储区,存放在
这个区域的量,可以存在到整个程序退出。
而p1的作用域要看上下文,在这段代码中是不能确定的,作用域是与代码定义的位置有关。所以p1是否为全局不可知。
而p2是否为局部,也是不可知的。
源文件中代码主要有两大位置,一个是函数大括号内,一个是函数大括号外。
函数大括号内属于函数的内部变量,也就是局部变量,其作用域属于该函数,只用在函数内部调用,在别的函数就不能用该变量。如果在函数大括
号外定义的变量,默认为全局变量,在其后的位置都可以调用。
这里不得不提一下static这个关键词。static修饰内部变量的时候,改变该变量的存储位置,由自动变量变为静态变量,存放在静态存储区,
生存周期便了,但作用域没变,该局部静态变量只能在函数内部调用。static修饰全局变量的时候,改变该变量的作用域,该全局变量只能在该源文件
中调用,不能被别的文件调用。存储位置和生存周期都没有。static修饰函数的时候,也是改变了函数的作用域,只能在该预案未见内调用。





yilin54 2009-04-21
  • 打赏
  • 举报
回复
总结了下大家的说法,大概是这样的结果吧

Q1:堆栈和栈是一个意思吧(不是数据结构中的栈)?
一般,我们说堆栈的时候,其实指的就是栈而已。 所以这里说他们2个是一个意思也是对的。


Q2: 栈和数据结构中的栈是类似的,他们的操作方式都是后进先出。那么堆和数据结构中的堆有什么不一样?他们有什么样的操作方式呀?

堆是结构是链表的形式。不过大家好像都没有说这个堆和数据结构中的堆的区别啊。


Q3:char *p1="aaa";
char p2[]="bbb";
为什么说p1是个全局的数组(即全局变量),而p2是个局部的数组。
是这样的"aaa"被写在了静态内存区,使得p1指向它
而char p2[]="bbb";是在堆之中分配内存,并将"bbb"拷贝到这块内存中
而全局变量和局部变量牵扯到的是数据的作用域与生存期的问题


lingyin55 2009-04-21
  • 打赏
  • 举报
回复
全局变量,静态变量是属于全局数据区;
所有的类和非成员函数的代码都存放在代码区;
为成员函数运行而分配的局部变量的空间都在栈区,剩下的那些空间都属于堆区。
lingyin55 2009-04-21
  • 打赏
  • 举报
回复
malloc或new都是动态的进行内存空间的申请,所开辟的空间都来源于堆中。
而对于定义的一些局部和全局的变量,一般都是存放在栈或者相应的数据区中。
因此对于全局变量的定义,一般都不会定义的太大,比如定义全局数组,如果
数组太大都会采用malloc或new开辟内存的办法。
因为栈的空间比较小,一般只有1或2M,很容易就造成溢出。

[Quote=引用 8 楼 yilin54 的回复:]
是不是只有malloc或new出来的空间才放在堆中,其他的内存都是放在栈、数据区、代码区等这些地方啊?
[/Quote]
lingyin55 2009-04-21
  • 打赏
  • 举报
回复
可以这样理解
[Quote=引用 8 楼 yilin54 的回复:]
是不是只有malloc或new出来的空间才放在堆中,其他的内存都是放在栈、数据区、代码区等这些地方啊?
[/Quote]
yilin54 2009-04-21
  • 打赏
  • 举报
回复
第一个问题中,全局变量,静态全局/局部变量是放在数据区中,不是堆中的。

[Quote=引用 6 楼 zsjsgyy 的回复:]
q1:当然不是了
堆是用来存放全局变量,静态全局/局部变量
动态内存分配的也是堆
栈是用来存放局部非静态变量
函数被调用时,实参如栈,然后函数被调用
当函数生命周期结束是,实参被抛栈

q2:栈内存的使用时按顺序递增或递减的(机器决定),正如楼主所说,先入先出;栈是由系统维护,不必程序员操心
程序员可以动态分配内存,使用的就是堆内存,堆内存的使用比不是严格递增或递减,这样导致内存支离破碎
具体…
[/Quote]
yilin54 2009-04-21
  • 打赏
  • 举报
回复
是不是只有malloc或new出来的空间才放在堆中,其他的内存都是放在栈、数据区、代码区等这些地方啊?
zgjxwl 2009-04-21
  • 打赏
  • 举报
回复
先google看看。。
zsjsgyy 2009-04-21
  • 打赏
  • 举报
回复
q1:当然不是了
堆是用来存放全局变量,静态全局/局部变量
动态内存分配的也是堆
栈是用来存放局部非静态变量
函数被调用时,实参如栈,然后函数被调用
当函数生命周期结束是,实参被抛栈

q2:栈内存的使用时按顺序递增或递减的(机器决定),正如楼主所说,先入先出;栈是由系统维护,不必程序员操心
程序员可以动态分配内存,使用的就是堆内存,堆内存的使用比不是严格递增或递减,这样导致内存支离破碎
具体参考《c程序设计语言》

q3:“aaa”存放在静态数据区,p1是指向“aaa”地址的指针
“bbb”存放在栈中,当函数生命周期结束,“bbb”将被释放
baiwei156 2009-04-21
  • 打赏
  • 举报
回复
1.一般,我们说堆栈的时候,其实指的就是栈而已。
所以这里说他们2个是一个意思也是对的。

2.
堆栈中的堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。

堆分配的时候
首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序。

这点和数据结构中的出堆很像,还有有一定的联系的


3.因为"aaa" 在编译的时候,编译器认为它是一个常量,把他分配到了数据区中。

而char p2[]="bbb",是在程序运行的时候临时在栈中分配空间存放的。
Qlaiaqu 2009-04-21
  • 打赏
  • 举报
回复
有以下几个问题请教下:

Q1:堆栈和栈是一个意思吧(不是数据结构中的栈)?
//////////
我不知道为什么他们喜欢把堆说成堆栈,自然堆栈其实是说堆,而栈就是栈了
Q2: 栈和数据结构中的栈是类似的,他们的操作方式都是后进先出。那么堆和数据结构中的堆有什么不一样?他们有什么样的操作方式呀?
这两者其实没有精确关系,只是看起来行为很相似而已。正如栈有先进先出的特性,而堆有随意访问的特性一般。
Q3:char *p1="aaa";
char p2[]="bbb";
为什么说p1是个全局的数组(即全局变量),而p2是个局部的数组。
是这样的"aaa"被写在了静态内存区,使得p1指向它
而char p2[]="bbb";是在堆之中分配内存,并将"bbb"拷贝到这块内存中
而全局变量和局部变量牵扯到的是数据的作用域与生存期的问题
  • 打赏
  • 举报
回复
堆和栈的区别
一、预备知识—程序的内存分配
一个由c/C++编译的程序占用的内存分为以下几个部分
1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。
3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放
4、文字常量区—常量字符串就是放在这里的。 程序结束后由系统释放
5、程序代码区—存放函数体的二进制代码。
二、例子程序
这是一个前辈写的,非常详细
//main.cpp
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"优化成一个地方。
}


看完基本就差不多可以了

http://www.cppblog.com/mzty/archive/2007/12/03/37679.html
mengde007 2009-04-21
  • 打赏
  • 举报
回复

http://www.diybl.com/course/3_program/c++/cppsl/2008618/126441.html

69,394

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧