2016-12-15 14 views
0

静的変数は、スタックセクションに格納されている自動変数とは異なり、プログラムのデータセグメントに格納されます。 以下のようなコードを書くとします。静的変数記憶域の説明

#include <stdio.h> 
void temp(); 
int main() 
{ 
    static int a=10; 
    temp(); 
    return 0; 
} 
void temp() 
{ 
    static int a=20; 
} 

ここで、同じ静的変数名は2つの関数で定義されています。データセグメントのレイアウトには、同じ名前の変数が2つあります。 これはコンパイル/実行時に混乱を招くことはありませんか?どのようにこれは現在回避されますか?

答えて

2

これらの2つの静的変数は異なるスコープを持つため、競合しません。staticは、変数を格納する場所を定義するストレージクラスです。変数のスコープとは無関係です。 、変数はちょうどそれらのアドレスで識別されたデータ・セグメントのレイアウトで

データセグメント内の任意の命名はありません同じ名前の2つの変数

があるだろう、ない名前

1

たら、コンパイラがソースファイルをコンパイルした場合、変数自体は生成されたコードには存在しません。の位置はです。

これは、2つの異なる機能で同じ名前の2つの異なる変数を持つことができる理由です。

異なるスコープの変数をお互いに分けている限り、コンパイラがどのように実装するかは重要ではありません。

0

データセグメントのレイアウトには、同じ名前の変数が2つあります。これはコンパイル/実行時に混乱を招くことはありませんか?

これは変数の範囲が有効になる場所です。 main()temp()意志シェードa

atemp()が実行されています。これは、temp()が実行されているときに、静的ローカル変数aが有効であることを意味します。制御がmainに戻ると、aのバージョンがmainになります。

+2

いいえ、ここにシャドーイングはありません。大域的な 'a'が宣言されているかどうかです。 –

+0

@MichaelWalzシャドーイングは静的であるかどうかにかかわらず発生します。 – artm

+2

はい、 'static'は問題ではありませんが、' temp() 'の' a'(staticまたはnot)は 'main()'の 'a'(静的か否か)をシャドウしません。以前に宣言された_global_変数 'a'(静的かどうか)をシャドウします。詳細は、[こちらを読む](https://en.wikipedia.org/wiki/Variable_shadowing)を参照してください。 –

関連する問題