我想访问变量v1&在main()
中的Func()中的v2int main(void)
{
Func();
int k = ? //How to access variable 'v1' which is in Func()
int j = ? //How to access variable 'v2' which is in Func()
}
void Func()
{
int v1 = 10;
int v2 = 20;
}
我听说我们可以从Stack访问。但该怎么做。
谢谢。
答案 0 :(得分:9)
你不能合法地这样做。一旦执行离开它们声明的范围,自动变量就会消失。
我确信有一些技巧,比如检查堆栈并及时“倒退”,但所有这些技巧都是依赖于平台的,例如,如果你导致堆栈被{{{ 1}}。
答案 1 :(得分:4)
你为什么要这样做?您希望这些值作为返回值吗?我会为它引入一个结构,根据值的含义,struct将得到一个合适的名称
struct DivideResult {
int div;
int rem;
};
DivideResult Func() {
DivideResult r = { 10, 20 };
return r;
}
int main() {
DivideResult r = Func();
}
否则,这些变量用于在激活函数时管理函数中的本地状态。在函数终止后,它们不再具有任何意义或生命。
答案 2 :(得分:3)
您可以采取以下措施:
但是没有访问标准的main()中的Func()堆栈。
答案 3 :(得分:2)
你无法轻易做到这一点。当Func()的堆栈帧消失时,没有可靠的方法来访问它。它可以自由地被践踏。但是,在x86-64中,有一个称为红色区域的东西,它是堆栈指针下面的128B区域,可以避免践踏,理论上你可能仍然能够访问它,但是这不便携,简单,也不正确。简单地说,不要这样做。
我将如何做到这一点:
int main(void)
{
int k, j;
Func(&k, &j);
}
void Func(int *a, int *b)
{
*a = 10;
*b = 20;
}
答案 4 :(得分:1)
你在C / C ++领域。你做不到的事情很少。
如果这是您自己的代码,您甚至不应该尝试这样做。像其他人建议的那样:通过引用传递输出参数(或通过C中的指针传递)或返回结构中的值。
但是,由于您提出了这个问题,我假设您正在尝试查看只有二进制访问权限的内容。如果它只是一次性的事情,使用调试器会更容易。
无论如何,要回答您的原始问题,请尝试以下代码。您必须为x86 CPU编译它,优化并关闭任何堆栈调试标志。
void f() {
int i = 12345;
int j = 54321;
}
int main()
{
int* pa = 0;
int buf[16] = {0};
f();
// get the stack pointer
__asm {
mov dword ptr [pa],ESP
}
// copy the stack, try not to do anything that "use" the stack
// before here
for (int i = 0; i < 16; ++i, --pa) {
buf[i] = *pa;
}
// print out the stack, assuming what you want to see
// are aligned at sizeof(int)
for (int i = 0; i < 16; ++i) {
std::cout << i << ":" << buf[i] << std::endl;
}
return 0;
}