在c语言中,被调用(派生)函数如何访问调用方(基)函数的变量?

在c语言中,被调用(派生)函数如何访问调用方(基)函数的变量?,c,function,parameters,main,C,Function,Parameters,Main,考虑以下代码: void foo(){ ..... } int main() { int arr[3][3] ; char string[10]; foo(); return 0; } 函数foo如何在不将参数作为函数参数传递给函数的情况下访问主函数的局部变量?函数foo是否有足够的权限访问和修改main中的变量? 请回复 谢谢根据C语言规范,其他函数无法访问函数的局部变量。没有合法的、受支持的方式来满足你的要求。也就是说,在C语言的大多数(全部?)实现中

考虑以下代码:

void foo(){
   .....
}
int main()
{
    int arr[3][3] ;
    char string[10];
    foo();
    return 0;
}
函数foo如何在不将参数作为函数参数传递给函数的情况下访问主函数的局部变量?函数foo是否有足够的权限访问和修改main中的变量? 请回复
谢谢

根据C语言规范,其他函数无法访问函数的局部变量。没有合法的、受支持的方式来满足你的要求。也就是说,在C语言的大多数(全部?)实现中,主函数的变量将存储在堆栈上,这很容易定位,任何人都可以读写(必须这样做,因为每个人都需要在其中存储本地信息),因此在技术上是可能的(尽管这是一个非常糟糕的想法)


在某些系统(如32位x86系统)上,此代码可能访问主函数内部的变量,但很容易被破坏(例如,如果此系统上的指针为8字节,如果堆栈上有填充,如果使用堆栈金丝雀,如果每个函数中有多个变量,并且编译器对这些变量的顺序有自己的想法,等等,则此代码将无法按预期工作)。所以不要使用它,使用参数,因为没有理由不这样做,它们会工作。

参数的用途可能是重复的。答案非常极端。此外,在有参数的函数中,这些参数实际上是函数的局部变量,但它们可能驻留在寄存器中,而不是堆栈中。所以这个答案是真的很糟糕,即使有时它可能是“形式上正确的”。你是说代码样本真的很糟糕吗?我同意,但我觉得这里有一个机会来阐明某些东西是如何“在引擎盖下”工作的(而不仅仅是澄清一些关于C语言本身的事情)并认为,值得冒这个风险,询问者可能会跳过“永远不要做这个警告”并使用这个无意义的代码。如果你有建议如何更清楚地表明我不赞成这种行为,我洗耳恭听。不,这不是代码,你也正确地说了“不要使用它”.根据我的品味,这是一个不适合这个答案的想法。几年前,我确实做到了你在这里描述的事情,它起了作用。但我确实知道编译器的实现,我也使用了汇编程序,这是一个非常特殊的情况(多任务的实现).上下文非常精确;相反,你回答某人问“foo()有足够的特权…”…这让我觉得他是个初学者,不会被复杂的内部结构骚扰。就是这样。
void foo(){
    int b; // puts a 4 byte word on the stack atop the return address
    (&b)[2]; // interpret b as the first entry in an array of integers (called the stack)
    // and offset past b and the return address to get to a
    // for completeness
    (&b)[0]; // gets b
    (&b)[1]; // gets the return address
}
int main()
{
    int a; // puts a 4 byte word on the stack
    foo(); // puts a (sometimes 4 byte) return address on the stack atop a
    return 0;
}