关于堆栈的一些问题

zjtzlqr 2013-01-24 08:56:00
在堆栈的百度百科里面看到下面一串代码
//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"优化成一个地方。


全局初始化区是什么意思? 全局变量有没有类似全局堆栈之类的东西
变量b是在main函数的堆栈中 ,如果程序还有其他子函数的话,其他子函数中的堆栈和main函数的堆栈有什么联系,是不是本质上都是一样的

主要是对堆栈的概念不太明确
...全文
306 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
xxyifan 2013-02-02
  • 打赏
  • 举报
回复
看一下内存布局: 1.代码区===========存放CPU执行的机器指令,只读且共享 2.初始化变量区/数据区=========程序中明确被初始化的变量,如全局变量 3.未初始化变量区/bss段============一般以程序启动时不会映射,只有初始化时才会出现 4.栈=============这个比较简单,一段内存连续,却向下增长,比如参数、局部变量 5.堆=============用于动态内存分配,如你使用new/malloc时申请的内存,这个最不好管理
SP_mah0ne 2013-02-02
  • 打赏
  • 举报
回复
全局变量初始化了的, 在.data段, 全局变量未初始化的在.bss段, 一般用0填充, 其他在运行中分配空间, main函数栈与其子函数栈相邻
zjtzlqr 2013-02-01
  • 打赏
  • 举报
回复
编译器在int b的时候到底是怎么给分配栈地址的,会把内存中哪一块分配给b的?
zjtzlqr 2013-01-28
  • 打赏
  • 举报
回复
引用 8 楼 xiaohuh421 的回复:
http://wenku.baidu.com/view/64b93f23dd36a32d7375810c.html http://wenku.baidu.com/view/4c4505660b1c59eef8c7b46b.html 这两个上面已经讲得很清楚了吧, 楼主好好理解下, 打好基础. 引用 7 楼 zjtzlqr 的回复:堆 (数据结构) ……
以前没看清楚,以为堆是一种数据结构而栈是一种存储方式
zslInSz 2013-01-28
  • 打赏
  • 举报
回复
引用 7 楼 zjtzlqr 的回复:
堆 (数据结构) 堆的定义如下:n个元素的序列{k1,k2,ki,…,kn}当且仅当满足下关系时,称之为堆。 " ki<=k2i,ki<=k2i+1;或ki>=k2i,ki>=k2i+1.(i=1,2,…,[n/2])" 若将和此次序列对应的一维数组(即以一维数组作此序列的存储结构)看成是一个完全二叉树,则堆的含义表明,完全二叉树中所有非终端结点的值均不大于(或……
这两个堆是指的不同的东西,你在这里问的堆是一个内存管理单元,由系统分配的。而你百度的这个堆是个数据结构。所谓的常量区一般就是.idata段,你可以看下PE结构。程序主要的段
AnYidan 2013-01-28
  • 打赏
  • 举报
回复
lz 哪来的程序,如果来自 单片机,google -- idata 和udata
DyanWang 2013-01-28
  • 打赏
  • 举报
回复
常量区就是代码区,除全局变量和静态变量,所有由编译器分配的变量都在栈区,由程序员自己申请的(malloc,calloc,realloc,new)就在堆区,程序员自己申请的空间在使用结束后也要自己释放(free,delete),否则会造成内存泄漏
sfd1234 2013-01-25
  • 打赏
  • 举报
回复
堆栈说着简单,起始用起来不容易!
zjtzlqr 2013-01-25
  • 打赏
  • 举报
回复
堆 (数据结构) 堆的定义如下:n个元素的序列{k1,k2,ki,…,kn}当且仅当满足下关系时,称之为堆。 " ki<=k2i,ki<=k2i+1;或ki>=k2i,ki>=k2i+1.(i=1,2,…,[n/2])" 若将和此次序列对应的一维数组(即以一维数组作此序列的存储结构)看成是一个完全二叉树,则堆的含义表明,完全二叉树中所有非终端结点的值均不大于(或不小于)其左、右孩子结点的值。由此,若序列{k1,k2,…,kn}是堆,则堆顶元素(或完全二叉树的根)必为序列中n个元素的最小值(或最大值)。[1] 这里的 p1 = (char *)malloc(10); p2 = (char *)malloc(20); 分配得来的10和20字节的区域就在堆区。(堆区是什么意思?堆不是一种数据结构吗? p2 = (char *)malloc(20);这个函数分配的内存难道就符合这种数据结构?
zjtzlqr 2013-01-25
  • 打赏
  • 举报
回复
引用 5 楼 wade_2003 的回复:
全局初始化区 这里定义的变量,它的作用域是从定义的时候开始,一直到所有程序运行结束;而main()里的变量b 出了main()函数,你就用不了啦。
static int c =0; 全局(静态)初始化区 静态的变量不是只有函数自己可以用吗? char *p3 = "123456"; 123456\0在常量区,p3在栈上。 常量区是什么意思?
wade_2003 2013-01-25
  • 打赏
  • 举报
回复
全局初始化区 这里定义的变量,它的作用域是从定义的时候开始,一直到所有程序运行结束;而main()里的变量b 出了main()函数,你就用不了啦。
zjtzlqr 2013-01-25
  • 打赏
  • 举报
回复
引用 1 楼 Emiyasstar__ 的回复:
main函数以外的变量存储在全局存储区 每个线程只有有一个调用栈,每个子函数通过栈帧控制自己的部分 最后,堆是堆,栈是栈,最好不要混起来讲
应该是压入栈,还有个问题,ucos中不是说每个任务都有自己的任务栈吗,任务切换不是把当年任务的一些寄存器指针什么的压栈,任务返回时把他们出栈
zjtzlqr 2013-01-25
  • 打赏
  • 举报
回复
引用 1 楼 Emiyasstar__ 的回复:
main函数以外的变量存储在全局存储区 每个线程只有有一个调用栈,每个子函数通过栈帧控制自己的部分 最后,堆是堆,栈是栈,最好不要混起来讲
我们平常所说的压栈的意思是压入堆还是压入栈
子善旬 2013-01-24
  • 打赏
  • 举报
回复
要先了解memory layout的概念,网上很容易找到的
Emiyasstar__ 2013-01-24
  • 打赏
  • 举报
回复
main函数以外的变量存储在全局存储区 每个线程只有有一个调用栈,每个子函数通过栈帧控制自己的部分 最后,堆是堆,栈是栈,最好不要混起来讲

70,023

社区成员

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

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