C++変数格納場所

2195 ワード

転入元:1.https://blog.csdn.net/songzige/article/details/51329512
           2.https://zhuanlan.zhihu.com/p/40536998
C言語はメモリに以下の領域に分けられます.
1メモリスタック領域:ローカル変数名を格納します.
2メモリスタック領域:newまたはmallocから出てきたオブジェクトを格納します.
3定数領域:ローカル変数またはグローバル変数の値を格納します.
4静的領域:グローバル変数または静的変数を格納するために使用されます.
5コード領域:バイナリコード.
 
メモリ割り当てのメカニズムは、ポインタの概念を理解するのに役立ちます.
C/C++はjavaのようなゴミ回収メカニズムを備えていないため、スタック内のデータをタイムリーに破棄する必要があります.そうしないとメモリの漏れを招きやすく、freeとdeleteを使用してnewとmallocが申請したスタックメモリを破棄しますが、スタックメモリは動的に解放されます.
グローバル変数/静的ローカル変数は、グローバルデータ領域(静的領域)に保存され、初期化されたものと実際には保存されず、通常のローカル変数はスタックに保存されます.
 
1.スタック領域(stack):プログラム実行時にコンパイラによって自動的に割り当てられて格納される:関数のパラメータ値、ローカル変数の値.格納は連続しており、その動作はデータ構造のスタックに似ている.スタック領域が比較的高いアドレスでアドレスの成長方向を上にすると、スタックアドレスは下に成長するので、空間は限られており、windowsの下には1-2 Mが多い.
2.ヒープエリア(heap):メモリに別の記憶領域を開く.一般的にはプログラマによって割り当てられて解放される.プログラマが解放されなければ、プログラムの終了時にOSによって回収される可能性がある.保存:プログラマが申請したメモリ領域.記憶が不連続で、データ構造の中のスタックは別物であり、チェーンテーブルに類似しており、仮想メモリに制限されており、32 bitシステムは4 Gに達することができる.スタック領域は上向きに成長するための割り当てであるプログラマが申請したメモリ容量.
3.グローバル領域(静的領域)(static):コンパイラがコンパイルするとメモリが割り当てられます.グローバル変数と静的変数の格納はブロック化され、初期化されたグローバル変数と静的変数はブロック領域にあり、初期化されていないグローバル変数と初期化されていない静的変数は隣接する別のブロック領域にあります.プログラムが終了するとシステムによって解放されます.
付:静的ローカル変数は、自分で定義した関数体のみに表示されます.静的グローバル変数にはファイルの役割ドメインがあり、2つの異なるソースファイルは、2つの変数を表す同じ静的グローバル変数と名前を付けることができます.グローバル変数定義のソースファイルでは、externキーでこのグローバル変数を再宣言する必要があります.
4.読み取り専用領域定数領域:定数文字列はここに配置されます.プログラムが終了するとシステムから解放されます.プログラムコード領域:関数体のバイナリコードを格納します.5.スタック内の記憶内容スタック:関数呼び出し時にスタック順a.主関数における関数呼び出し後の次の命令(関数呼び出し文の次の実行可能文)のアドレスb.数の各パラメータであり、ほとんどのCコンパイラでは、パラメータは右から左へスタックに入るc.であり、関数中の局所変数である.(静的変数は、グローバル領域にスタックされないことに注意してください).
出桟順.6.ヒープの内容:ヒープの頭が1バイトでヒープの大きさを保存する2、例プログラムこれは先輩が書いたもので、とても詳しい
    //main.cpp 

    int a = 0;        

    char *p1;         

    main() 

    { 

    int b;//   

    char s[] = "abc"; //  

    char *p2; //  

    char *p3 = "123456"; 123456\0";//    ,p3   。 

    static int c =0; //  (  )     

    p1 = (char *)malloc(10); 

    p2 = (char *)malloc(20); 

    //     10 20         。 

    strcpy(p1, "123456"); //123456\0     ,         p3    "123456"       。 

    }