被调用(派生)函数如何以c语言访问调用者(基)函数的变量?

问题描述:

考虑下面的代码:被调用(派生)函数如何以c语言访问调用者(基)函数的变量?

void foo(){ 
    ..... 
} 
int main() 
{ 
    int arr[3][3] ; 
    char string[10]; 
    foo(); 
    return 0; 
} 

如何函数foo访问我的主要功能的当地人没有参数传递给函数作为函数的参数?函数foo是否有足够的权限来访问和修改main中的变量? 请回复 谢谢

+5

可能重复的[可以访问本地变量的内存超出其范围?](http://*.com/questions/6441218/can-a-local-variables-memory-be-accessed-outside-its-范围) – Stargateur

+3

这就是参数的用途。 – stark

按照C语言规范,函数的局部变量是无法访问等功能。没有合法的,支持的方式去做你所要求的。也就是说,在C语言的大多数(全部)实现中,主函数的变量将存储在堆栈中,这很容易定位,并且可以被任何人读取(它必须是因为每个人都需要存储本地信息在它),所以它在技术上是可能的(尽管这是一个非常糟糕的主意)。

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; 
} 

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

+0

真是极端的答案。而且,在有参数的函数中,这些参数实际上是函数的局部变量,但可能它们驻留在寄存器中 - 而不是堆栈中。所以这个答案是非常糟糕的,即使有时它可以是“正式正确的”。 – linuxfan

+0

你的意思是代码示例非常糟糕?我同意,但我觉得这里有一个机会可以让我们了解某些事情是如何“隐藏起来的”(而不是仅仅清理一些关于C语言本身的东西),并且觉得值得提问者的风险可能会跳过“永远不要做这个警告”并利用这个无意义的代码。如果你对如何更清楚地表明我不赞同这种行为有什么建议,那我就会全神贯注。 – Irisshpunk

+0

不,这不是代码,正确的你也说“不要使用它”。根据我的口味,这是整个想法,不适合这个答案。几年前,我确实如此描述了它,并且它工作正常。但我完全知道编译器的实现,我也用过汇编器,这是一个非常特殊的情况(多任务的实现)。背景非常精确;相反,你回答有人问“拥有足够的特权......”......这让我觉得他是初学者,不会被困难的内部调戏。只是。 – linuxfan