“栈”这个数据结构本身并没有规定其生长的方向,具体实现中向高地址或者低地址生长都无妨。但是对于操作系统而言,栈的生长方向一般是取决于处理器对PUSH/POP操作的实现。对于x86来说,PUSH以后SP/ESP的值是减小,因此它是向低地址生长的,样例代码:#include
void stack_growth(char *function_parameter) {
char local;
if (&local > function_parameter)
printf("up\n");
else
printf("down\n");
printf("%p %p\n", &local, function_parameter);
}
int main()
{
char c = 'c';
stack_growth(&c);
return 0;
}
而声明一个变量,无非是告诉编译器,在栈上给它准备一块空间。因此你所提及的情况,实际上与栈无直接关系:a先声明的话,就一定会先在栈上为它分配空间吗?举个最简单的栗子,如果a根本没被用到,编译器完全可以不为它分配空间。所以这个最终还是取决于编译器的实现。
补充一段WIKI吧:Some processors families, such as the x86, have special instructions for manipulating the stack of the currently executing thread. Other processor families, including PowerPC and MIPS, do not have explicit stack support, but instead rely on convention and delegate stack management to the operating system's Application Binary Interface (ABI).