堆栈是向上还是向下增长?我在c中有这段代码:int q = 10;int s = 5;int a[3];printf("Address of a: %d\n", (int)a);printf("Address of a[1]: %d\n", (int)&a[1]);printf("Address of a[2]: %d\n", (int)&a[2]);printf("Address of q: %d\n", (int)&q);printf("Address of s: %d\n", (int)&s);输出是:Address of a: 2293584Address of a[1]: 2293588Address of a[2]: 2293592Address of q: 2293612Address of s: 2293608所以,我看到,从那里a开始a[2],内存地址每个增加4个字节。但是,从q到s,内存地址减少了4个字节。我想知道两件事:堆栈是成长还是下降?(在这种情况下看起来对我来说都是)a[2]和q内存地址之间发生了什么?为什么那里存在很大的记忆差异?(20个字节)。注意:这不是作业问题。我很好奇堆栈是如何工作的。谢谢你的帮助。
3 回答
慕容708150
TA贡献1831条经验 获得超4个赞
这实际上是两个问题。一个是关于当一个函数调用另一个函数时(当分配新帧时)堆栈增长的方式,另一个是关于如何在特定函数的框架中布置变量。
C标准都没有规定,但答案有点不同:
当分配新帧时,堆栈会以哪种方式增长 - 如果函数f()调用函数g(),那么
f
帧指针是否大于或小于g
帧的指针? 这可以采用任何一种方式 - 它取决于特定的编译器和体系结构(查找“调用约定”),但它在给定平台内始终保持一致(有一些奇怪的例外,请参阅注释)。向下是更常见的; 在x86,PowerPC,MIPS,SPARC,EE和Cell SPU中就是这种情况。函数的局部变量如何在其堆栈框架内布局?这是未指明的,完全不可预测; 编译器可以自由安排其局部变量,但是它喜欢获得最有效的结果。
- 3 回答
- 0 关注
- 1316 浏览
添加回答
举报
0/150
提交
取消