2016-10-01 21 views
-2

Cで束縛変数を作成しようとしています。 したがって、forループを3回実行して3つの構造変数を作成するとします。 私の質問は、同じメモリロケーションを参照する変数を作成するのはなぜですか。 コード:ループ内でループ内の構造体変数を作成する

struct arrIndexStruct { 
    int *arr; 
    int index; 
}; 


int main() { 
    int i; 
    for (i=0; i<3; i++) { 
     struct arrIndexStruct arrayIndexStruct; 
     arrayIndexStruct.arr = someArray; 
     arrayIndexStruct.index = i; 
     printf("%p\n",(void *)&arrayIndexStruct); 
    } 
} 

私が手出力は次のようになります。

0x7ffeed84f690 
0x7ffeed84f690 
0x7ffeed84f690 

私は

struct arrIndexStruct arrayIndexStruct1; 
struct arrIndexStruct arrayIndexStruct2; 
printf("%p\n",(void *)&arrayIndexStruct1); 
printf("%p\n",(void *)&arrayIndexStruct2); 

をすれば、私は違いは何ですか

0x7ffc484e64d0 
0x7ffc484e64e0 

を得るでしょう、一方で2つの行動の間にループのローカルスコープはありますか? ありがとう!

+2

これらのスコープよりも長生きする必要はないからです。自動変数が何であるか知っていますか?そうでない場合は、検索してください。 – Olaf

答えて

1

変数は、コードの最初の出現以降、囲むブロックの最後まで定義されています。スコープの終わりに達すると、元のメモリは他のものに使用できます。

特にループ内では、変数は常にコンパイラが達成できる最も簡単なものと同じ場所を占めます。

第2のケースが導入されている間、第1の変数が定義されたままであるので、第2のケースは完全に異なる。以下の例では同じアドレスを得ることができますが、コンパイラやデバッグレベル、最適化などにも依存します。

関連する問題