栈的增长方向和变量内存分配没有关系
帖子回复:
1
一年多过去了,今天我搜到了这个帖子。正好我看到的一本书里面是这样说的:
默认的函数内部变量的压栈操作为:从上到下、从左到右,采用4字节对齐。数组的压栈方法略有不同,即从最后一个元素开始,直到起始元素为止,即采用从右向左的方法压栈。
书名是 《C语言进阶:重点、难点与疑点》
2
所谓 栈空间的生长方式由高到低,指的是(以 X86 体系结构为例),一些默认使用 sp (stack pointer)寄存器的指令,如 push, pop, call, ret 等,在入栈的时候 sp 会减小,出栈的时候 sp 增加。
其实栈空间也是一段普通的内存,可以任意的方式访问;sp 也可以不通过 push pop 直接操作。
以上是机器语言实现层面的问题。在这里,没有所谓数组的概念。
在访问函数参数与局部变量的时候,几乎一定是不会用 push 和 pop 的。
开辟空间的时候,参数入栈经常不使用 push ,局部变量开辟空间几乎一定不会用 push (而是直接 sub sp)。
编译器生成代码用 sub sp 预留一段空间给局部变量用,然后把那一段给那个变量用,编译器就可以自行决定了。
由于这只是一段普通的内存,当然怎么用都可以。
以下说 C 语言。
然而 C 语言本身并没有栈的概念。
C 语言只规定了一些特殊情况下的指针比较结果,如在两个指针指向同一数组中的元素时(序号大的大于序号小的),指向同一个结构体对象的成员时(后定义的成员大于先定义的成员),等等。但是对于指向同一个函数的不同局部变量的指针之间的比较结果并没有规定。也就是说,编译器可以随便安排他们的顺序。
===================
这里应该是将不同层面的问题混淆在了一起。
其他回复可参看论坛
论坛讨论:http://bbs.csdn.net/topics/390747622