gpt4 book ai didi

c - 堆栈在 Linux 中以错误的方向增长

转载 作者:太空狗 更新时间:2023-10-29 11:23:31 25 4
gpt4 key购买 nike

我研究过在 linux 系统中堆栈从高内存地址增长到低内存地址。为了测试这一点,我写了一个小代码:

#include<stdio.h>
void func() {
int var1;
int var2;
printf("Func: %p %p",&var1,&var2);
}

int main() {
int var1;
int var2;
printf("Main: %p %p\n",&var1,&var2);
func();
return 0;
}

当我在 ideone 中运行它时,我得到以下输出:

Main: 0xbfd958f0 0xbfd958f4
Func: 0xbfd958f8 0xbfd958fc

根据教科书,Func应该存放在Lower memory address而不是Main,但是这里发生的事情是完全相反的。有人可以向我解释这种行为。这是 link to ideone .

谢谢。

最佳答案

通常堆栈从高内存向下增长,而堆从低内存增长,因此它们永远不会相互“碰撞”。

不过,理论上堆栈可以向任一方向增长。 x86 支持堆栈向任一方向增长,但我从未见过有人故意使用向上增长的堆栈。

最棒的是,英特尔将向下增长的堆栈称为“向上增长”,将向上增长的堆栈称为“向下增长”。

注意:-您不应该对堆栈帧内的局部变量的顺序做出任何假设。编译器可能会将“第一个”变量“放在第一位”,将其推到当前位置,这意味着“第一个”变量位于更高的地址。或者它可以在内存中向上组织变量(更有可能)给“第一个”变量一个较低的地址。或者它可以完全随机地排列变量。如果进行优化,它甚至可能会消除变量,或者如果多个变量的生命周期不重叠,则将相同的内存位置用于多个变量。

您可以点击此链接 BUFFER OVERFLOW 7

但仍然重要的是要知道返回地址不能保证以任何特定方式排列。如果使用-fomit-frame-pointer,那么基址指针将不会在栈上。正如我之前所说,局部变量的顺序不符合特定约定。

另一种复杂情况是在同一个程序中存在多个调用约定。通常不可能仅仅通过查看代码地址来判断一个函数符合什么约定。堆栈框架看起来可能与您的预期大不相同。

关于c - 堆栈在 Linux 中以错误的方向增长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24990623/

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