C言語における変数の格納場所

2644 ワード

変数の格納場所

  • 通常メモリ
  • ランタイムスタック
  • ハードウェアレジスタ
  • 変数のデフォルトのストレージタイプは、その宣言位置に依存します.
  • 任意のコードブロックの外で宣言された変数は、常に静的メモリに格納される.スタックメモリに属していません.このような変数を静的変数と呼びます.静的変数は、関数の実行前に作成されます.
  • コードブロック内で宣言された変数のデフォルトの格納タイプは、スタックに自動的に格納されます.
  • コードブロック内で宣言された変数に対してstaticキーワードを追加すると、そのストレージタイプを自動的に静的に変換できます.静的ストレージタイプを持つ変数は、実行中ずっと存在します.コードブロックが実行されるときだけではありません.
    注:変数のストレージタイプを変更します.変数の役割ドメインは変更されません.コードブロック内に名前でアクセスするだけです.
  • レジスタ変数:registerキーワード
    2つの概念を明確にします.
  • 格納タイプ:この変数がアドレス空間のどの領域に格納されているかを指す.
  • 役割ドメイン:この変数は、どの領域にのみアクセスできますか.たとえば、変数がグローバルであれば、コード領域全体にアクセスできます.関数の内部にある場合は、その関数の内部にのみアクセスできます.


  • 変数の初期化


    明示的な初期化がなければ、静的変数の初期化は0になります.自動変数は初期化されず、ランダム値です.

    static定義変数

    #include 
    
    static int m;
    int fun1()
    {
        static int n = 0;
        n++;
        printf("n=%d
    "
    , n); } int fun2() { m = 0; m++; printf("m=%d
    "
    , m); } int main() { int i = 0; for (i = 0; i < 5; ++i) fun1(); for (i = 0; i < 5; ++i) fun2(); return 0; }

    staticまとめ:
  • staticがグローバル変数または関数を修飾すると、その変数格納タイプと役割ドメインは変わらず、そのリンク属性のみを変更し、外部リンクを内部リンクに変更します.すなわち、変数または関数は、現在のソースファイルにのみアクセスでき、他のソースファイルにはアクセスできません.
  • staticがローカル変数を修飾すると、その変数の役割ドメインとリンク属性(内部リンクのみ)は変更されず、そのストレージタイプのみが変更されます(タイプをスタック領域から静的領域に変更します).

  • 変数の役割ドメイン、リンク属性、およびストレージタイプの概要


    変数のタイプ
    場所の宣言
    スタックに格納するかどうか
    アクティブドメイン
    staticと宣言した場合
    グローバル変数
    すべてのコードブロックの外
    いいえ
    宣言からファイルの最後まで
    リンクのプロパティが変更され、他のファイルからのアクセスは許可されません.
    ローカル変数
    コードブロックの先頭
    はい
    コードブロック全体
    ストレージタイプはスタック領域から静的領域に変わり、プログラム全体の実行期間中に値が保持されます.
    形式パラメータ
    関数ヘッダ
    はい
    かんすう全体
    許可しない