堆栈是向上还是向下增长?

堆栈是向上还是向下增长?

我在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: 2293584

Address of a[1]: 2293588

Address of a[2]: 2293592

Address of q: 2293612

Address of s: 2293608

所以,我看到,从那里a开始a[2],内存地址每个增加4个字节。但是,从q到s,内存地址减少了4个字节。


我想知道两件事:


堆栈是成长还是下降?(在这种情况下看起来对我来说都是)

a[2]和q内存地址之间发生了什么?为什么那里存在很大的记忆差异?(20个字节)。

注意:这不是作业问题。我很好奇堆栈是如何工作的。谢谢你的帮助。


茅侃侃
浏览 1321回答 3
3回答

慕容708150

这实际上是两个问题。一个是关于当一个函数调用另一个函数时(当分配新帧时)堆栈增长的方式,另一个是关于如何在特定函数的框架中布置变量。C标准都没有规定,但答案有点不同:当分配新帧时,堆栈会以哪种方式增长 - 如果函数f()调用函数g(),那么f帧指针是否大于或小于g帧的指针? 这可以采用任何一种方式 - 它取决于特定的编译器和体系结构(查找“调用约定”),但它在给定平台内始终保持一致(有一些奇怪的例外,请参阅注释)。向下是更常见的; 在x86,PowerPC,MIPS,SPARC,EE和Cell SPU中就是这种情况。函数的局部变量如何在其堆栈框架内布局?这是未指明的,完全不可预测; 编译器可以自由安排其局部变量,但是它喜欢获得最有效的结果。
打开App,查看更多内容
随时随地看视频慕课网APP