2017-01-02 12 views
0

は、次のコードを考えてみましょう:呼び出し元(派生)関数は、呼び出し元(基本)関数の変数にC言語でどのようにアクセスできますか?

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

どのようにすることができます関数fooのアクセス関数の引数として関数にパラメータを渡すことなく、私の主な機能の地元の人々?関数fooはmainの変数にアクセスして変更するのに十分な特権を持っていますか? 返信してください ありがとう

+5

[ローカル変数のメモリはスコープの外部にアクセスできますか?](http://stackoverflow.com/questions/6441218/can-a-local-variables-memory-be-accessed-outside-its-スコープ) – Stargateur

+3

それは何のためのパラメータです。 – stark

答えて

0

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システムのような)いくつかのシステムでは、main関数の内部変数にアクセスするかもしれないが、それは非常に簡単に壊れている(例えばあります場合は、このシステム上のポインタは、8バイトである場合スタック上のパディング、スタックカナリアが使用されている場合、各関数に複数の変数があり、コンパイラがどのような順序であるべきかに関する独自のアイデアがある場合、このコードは期待どおりに機能しません)。使用しないでください。使用しないでください理由がないのでパラメータを使用してください。

+0

本当に極端な答えです。さらに、パラメータを持つ関数では、これらのパラメータは実際には関数のローカル変数ですが、おそらくそれらはスタックではなくレジスタに存在します。だから、たとえそれが "正式に正しい"ものであっても、この答えは本当に悪いです。 – linuxfan

+0

コードサンプルが本当に悪いのですか?私は同意しますが、ここでは、ある種のものが(単にC言語そのものについて何かを取り除くのではなく)「ボンネットの下で」どのように機能するかを明らかにする機会があったと感じており、質問者"この警告をしないでください"とすぐに跳び、このナンセンスコードを利用するかもしれません。私がこの行動を推薦しないことをより明確にする方法についての提案があれば、私はすべて耳にします。 – Irisshpunk

+0

いいえ、それはコードではなく、正しく "使用しないでください"と言っています。私の好みでは、この答えには適していないという考え方全体です。私は何年も前に、あなたがここで説明したものを正確に実行しました。しかし、私はコンパイラの実装を正確に認識していましたが、アセンブラも使用しました。これは非常に特殊なケースでした(マルチタスキングの実装)。文脈は非常に正確でした。代わりにあなたは誰かに "foo()十分な特権を持っています..."と尋ねる人に返信しました。私は彼が困難な内部で虐待されないほど初心者だと思うようになります。それだけ。 – linuxfan

関連する問題