gpt4 book ai didi

c - 局部变量在栈上的分配顺序

转载 作者:行者123 更新时间:2023-11-30 16:21:28 36 4
gpt4 key购买 nike

看一下这两个函数:

void function1() {
int x;
int y;
int z;
int *ret;
}

void function2() {
char buffer1[4];
char buffer2[4];
char buffer3[4];
int *ret;
}

如果我在 gdb 中的 function1() 处中断,并打印变量的地址,我会得到以下结果:

(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() 中,后面是 zy,最后是 x。在 function2() 中,ret 后面跟着 buffer1,然后是 buffer2buffer3 。为什么存储顺序会改变?我们在这两种情况下使用相同数量的内存(4 字节 int 与 4 字节 char 数组),因此这不可能是填充问题。这种重新排序可能是什么原因,此外,是否可以通过查看 C 代码提前确定局部变量将如何排序?

现在我知道 C 的 ANSI 规范没有提到局部变量的存储顺序,并且允许编译器选择自己的顺序,但我想编译器有关于如何存储局部变量的规则。解决了这个问题,并解释了为什么制定这些规则。

仅供引用,我在 Mac OS 10.5.7 上使用 GCC 4.0.1

最佳答案

我不知道why GCC organizes its stack the way it does (虽然我猜你可以破解它的源代码或 this paper 并找出答案),但我可以告诉你如何保证特定堆栈变量的顺序(如果出于某种原因你需要的话)。只需将它们放在一个结构中即可:

void function1() {
struct {
int x;
int y;
int z;
int *ret;
} locals;
}

如果我没记错的话,规范保证 &ret > &z > &y > &x。我把 K&R 留在了工作中,所以我无法引用章节和诗句。

关于c - 局部变量在栈上的分配顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54844391/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com