gpt4 book ai didi

c++ - 在堆栈上分配局部变量并使用指针算法

转载 作者:行者123 更新时间:2023-11-28 00:40:25 30 4
gpt4 key购买 nike

我读到,在函数中,局部变量被放入堆栈,因为它们是在参数首先放入那里之后定义的。

这个也提到了here

5 .All function arguments are placed on the stack. 6.The instructions inside of the function begin executing. 7.Local variables are pushed onto the stack as they are defined.

所以我预计如果 C++ 代码是这样的:

#include "stdafx.h"
#include <iostream>

int main()
{

int a = 555;
int b = 666;
int *p = &a;

std::cout << *(p+1);
return 0;
}

如果这里的整数有 4 个字节,我们调用堆栈上包含 int 前 8 位的内存空间 555 x,那么通过 *(p+1) 将另外 4 个字节“移动”到堆栈顶部,我们应该查看地址 x + 4 处的内存。

但是,它的输出是 -858993460 - 无论 int b 有什么值,它总是这样。显然它有一些标准值。当然,我正在访问一个我不应该访问的内存,因为这是变量 b。这只是一个实验。

我怎么既没有得到期望值,也没有非法访问错误?

我的假设哪里错了?
-858993460 代表什么?

最佳答案

其他人所说的(即“不要那样做”)是绝对正确的。不要那样做。但是,要真正回答您的问题,p+1 很可能指向调用者堆栈帧的指针或返回地址本身。系统维护的堆栈指针在您向其推送内容时递减。正式来说,这是依赖于实现的,但是我见过的每个堆栈指针(这是从 16 位时代开始的)都是这样的。因此,如果如您所说,局部变量在初始化时被压入堆栈,&a 应该 == &b + 1

也许插图是有序的。假设我在没有优化的情况下为 32 位 x86 编译您的代码,并且在我调用您的函数之前堆栈指针 esp 是 20(这不太可能,为了记录)。这是您调用 cout 的行之前内存的样子:

4: 12 (value of p)
8: 666 (value of b)
12: 555 (value of a)
16: -858993460 (return address)

p+1,因为 p 是一个 int*,所以是 16。这个位置的内存没有读保护,因为它是需要返回调用函数。

请注意,这个答案是学术性的;编译器的优化或处理器之间的差异可能会导致意外结果。但是,我不希望在任何具有我见过的任何调用约定的处理器架构上从 p+1== &b,因为堆栈通常向下增长。

关于c++ - 在堆栈上分配局部变量并使用指针算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19203323/

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