在main()中调用它后访问函数变量

时间:2009-07-10 14:22:15

标签: c++ c

我想访问变量v1&在main()

中的Func()中的v2
int 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访问。但该怎么做。

谢谢。

5 个答案:

答案 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)

您可以采取以下措施:

  1. 在main()中声明变量,并通过指针或引用将它们传递给Func()
  2. 返回变量或向量< int>,或您对main()
  3. 的变量所做的结构等
  4. 在Func()中动态分配变量,并返回指向它们的指针。然后你必须记得稍后删除分配的内存。
  5. 但是没有访问标准的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;
}