【问题标题】:Accessing variables in another function without the variable being in the function parameter访问另一个函数中的变量,而变量不在函数参数中
【发布时间】:2015-03-23 06:04:53
【问题描述】:
void foo() {
    int i = 3;
    bar();
}

void bar() {
    //print i in foo()
}

我想知道是否有某种方法可以在不设置全局变量的情况下做到这一点?

【问题讨论】:

  • 没有,但更重要的是,您为什么需要这样做?
  • 你为什么要这样做?如果没有您想要显示的任何地址或值,这是不可能的。
  • 没有看到你的作业我不能说,但我敢说你只需要分区步骤中枢轴的值。您应该能够在单独的步骤中预先计算它。
  • 我认为你遗漏了一些重要的东西。 C 中的数组是一个连续的内存块,由其第一个元素的地址标识。因此,如果您的数组是1, 2, 3, 4 ,5,您可以将4 的地址传递给一个函数(连同调整后的大小),它会认为它正在查看一个数组4, 5。这就是快速排序的全部递归性质。
  • 指针运算!我完全没有想到这一点,谢谢!

标签: c


【解决方案1】:

不,这是一个局部变量,存储在该方法的堆栈中,在该方法之外堆栈不存在且无法读取

【讨论】:

  • 也许它依赖于实现,但我可以根据局部变量的地址从任何函数中读取堆栈。我在 Debian 上使用 gcc,我可以从 bar 函数内部读取 i 变量的地址。
【解决方案2】:

如果你只想使用i的值,你可以使用:

void bar(int i);

void foo() {
    int i = 3;
    bar(i);
}

void bar(int i) {
    //print i in foo()
}

如果您希望能够修改i 的值,请使用:

void bar(int* ip);

void foo() {
    int i = 3;
    bar(&i);
}

void bar(int* ip) {
   *ip = 20;
}

【讨论】:

  • 我猜void bar(int*) 是 OP 寻找的。​​span>
【解决方案3】:

C 使用静态范围。你可以在这里查看:https://msujaws.wordpress.com/2011/05/03/static-vs-dynamic-scoping/ :)

【讨论】:

    【解决方案4】:

    只需将ifoo 传递给bar 作为参数:

    bar(i);
    
    void bar(int i)
    

    【讨论】:

      【解决方案5】:

      你可以,但你必须将它作为参数传递给foo。这样做的原因是,当调用 C 函数时,它会在堆栈中创建在其中定义的任何局部变量,这本质上只是动态内存分配的一种形式。当函数返回时,它会释放这些变量使用的内存。现在你可能认为bar 应该有一些方法可以了解i,因为当barfoo 中被调用时它仍然存在于堆栈中。但问题是 C 没有对谁可能调用 bar 函数做出任何假设。您可以很容易地从其中没有定义i 的第三个函数调用bar。由于这个原因,没有机制可以在不显式传递的情况下从嵌套函数访问堆栈变量。

      有趣的是,语言内置的这种能力是允许实现闭包的关键特性之一。因此,如果您曾经难以理解是什么让这些如此特别,那么基本上就是这样。可能没有炒作让你相信的那么壮观。

      【讨论】:

        猜你喜欢
        • 2022-12-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-10-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多