堆栈上的局部变量分配顺序
看看这两个功能:
void function1() { int x; int y; int z; int *ret;}void function2() { char buffer1[4]; char buffer2[4]; char buffer3[4]; int *ret;}
如果我打破function1()
了gdb
,并打印变量的地址,我得到这个:
(gdb) p &x $1 = (int *) 0xbffff380(gdb) p &y $2 = (int *) 0xbffff384(gdb) p &z $3 = (int *) 0xbffff388(gdb) p &ret $4 = (int **) 0xbffff38c
如果我做同样的事情function2()
,我得到这个:
(gdb) p &buffer1 $1 = (char (*)[4]) 0xbffff388(gdb) p &buffer2 $2 = (char (*)[4]) 0xbffff384(gdb) p &buffer3 $3 = (char (*)[4]) 0xbffff380(gdb) p &ret $4 = (int **) 0xbffff38c
您会注意到,在两个函数中,ret
都存储在最靠近堆栈顶部的位置。在function1()
,接下来是z
,y
最后x
。在function2()
,ret
然后是buffer1
,然后buffer2
和buffer3
。为什么存储顺序发生了变化?我们在两种情况下使用相同数量的内存(4字节int
s与4字节char
数组),因此它不能成为填充问题。这种重新排序有什么原因,而且,通过查看C代码可以提前确定如何排序局部变量?
现在我知道C的ANSI规范没有说明存储局部变量的顺序,并且允许编译器选择自己的顺序,但我想编译器有关于它如何处理的规则这个,并解释为什么这些规则是这样的。
作为参考,我在Mac OS 10.5.7上使用GCC 4.0.1
慕运维8079593
吃鸡游戏
繁花如伊
相关分类