为了测试栈的增长方向,测试源程序是
* #include<stdio.h>
*
* int main(void)
*
* {
*
* /*在栈上分配*/
*
* int i1=0;
*
* int i2=0;
*
* int i3=0;
*
* int i4=0;
*
* printf("栈:向下\n");
*
* printf("i1=%p\n",&i1);
*
* printf("i2=%p\n",&i2);
*
* printf("i3=%p\n",&i3);
*
* printf("i4=%p\n\n",&i4);
*
* return 0;
*
* }
显示结果是
栈:向下
i1=0x7ffdc7b44f98
i2=0x7ffdc7b44f9c
i3=0x7ffdc7b44fa0
i4=0x7ffdc7b44fa4
从结果看,地址是变大的,说明是向上增长啊。
但是,书上都说,栈是向下增长的,地址是变小的。为啥我的不一样呢?
我用的是gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04)。
一个函数内的变量,不能说明问题,因为编译器分配空间可以随意,得看2个函数调用,看下面的代码
#include <stdio.h>
void foo2();
void foo1()
{
int i1=0;
printf("foo1 i1=%p\n",&i1);
foo2();
}
void foo2()
{
int i2=0;
printf("foo2 i2=%p\n",&i2);
}
int main () {
foo1();
return 0;
}
foo1 i1=0x7fff2928c94c
foo2 i2=0x7fff2928c92c
说明向下
一个函数内的栈顺序说明不了这个问题。
程序在过多次函数调用(没有出口的递归)时回引起栈溢出,就是把栈空间用完了。函数相互调用时被调用函数的相关信息会一起送入栈,这些信息就包括了参数、返回地址和局部变量等等,叫做栈帧,而在一个栈帧内的这些东西其相对顺序是由编译器决定的,所以,仅仅在一个栈帧内做比较,都会有对编译器的依赖。
可以写一个递归函数,在这个函数里申请局部变量,观察变量的地址关系。
望采纳
foo()
{
int a;
printf("%p\n", &a);
foo();
}