あなたのレイアウトCプログラミング言語のプログラムメモリを教えます

以下に焦点を当てます。

  各セグメントを構成するメモリ内のC言語プログラム

  接続と一般的なエラー時のC言語プログラムの特長

  ファイル名を指定して実行C言語プログラム

  A:ストレージエリアC言語プログラム

  C言語コード(テキストファイル)から実行形式(バイナリ)、コンパイルする必要 - アセンブラ - 三の相を結びます。Cコンパイル・プロセスは、アセンブラ言語のテキストファイルを生成するために、バイナリマシンコードアセンブラを形成するための組み立て工程は、ソースファイルを分離する接続プロセスは、バイナリマシンコードファイルを一つのファイルにまとめられ発生しました。

  C言語で書かれたプログラムをコンパイル - 接続したら、いくつかの部分から構成され、統一ファイルを、形成することになります。部分を実行するいくつかの他のプログラムが生成され、各部分は異なる記憶領域を表します。

  1.コードセグメント(コードまたはテキスト)

  コードセグメントは、組成物中の機械コード・プログラムによって実行されます。C言語では、プログラム・ステートメントにコンパイルされたマシンコードが形成されています。プログラムの実行中に、今度はCPU機械コードの各コードセグメントにプログラムカウンタは、プロセッサによって実行されます。

  2.読み取り専用データセグメント(ROデータを)

  これらの変数は変化しないので、読み取り専用のデータセグメントは、データルックアップテーブル型の動作と同様を使用し、プログラムによって使用されるデータの一部を変更されていない、ROMに配置するだけでよいです。

  (RWデータ)を読み書きする3.初期化データセクション

  初期化されたデータは、プログラムの中で文を読んで、変数の初期値を持っている、これらの変数は、プログラム実行中にメモリのスペースを取るには、読み書きされるメモリ領域内に位置する必要があり、初期値と、実行時のために書きます。

  4.初期化されていないデータ・セグメント(BSS)

  初期化されていないデータは、プログラムが実行される前に、これらの変数は、メモリ内のスペースを取りません、プログラム内で宣言が、変数を初期化されません。

  5.ヒープ(ヒープ)

  プログラムは、一般的な配分を実行し、プログラマが解放したときに、ヒープメモリにのみ表示されます。プログラムが解放しない場合(例えばプロセスのような)プログラムが完了した後、オペレーティング・システムの場合には、オペレーティング・システムは、メモリを回復することができます。

  6.スタック(スタック)

  スタック空間は、コンパイラによって自動的に割り当てられ、解放され、唯一の実行中にメモリをスタック、関数内で使用される変数、関数パラメータとスタック領域を使用して値を返します。

  C言語のオブジェクトファイルのメモリレイアウト

  例を見てください:

  int型のA = 0; //グローバルな初期化領域。データセグメント

  静的int型、B = 20; //グローバルな初期化領域。データセグメント

  char * p1の; // .bssのセグメント初期化されていないグローバル領域

  CONST int型A = 10。//.rodata段

  無効メイン(無効)

  {

  int型のB; //スタック

  チャーS [] = "ABC"。//栈

  char * p2と; //スタック

  静的INT C = 0; // .dataセクショングローバル(静的)ゾーンの初期化

  するchar * P3 = "123456"; // 123456 \ 0一定の地域で、スタック上のP3。

  P1 =(CHAR *)のmalloc(10); //ヒープ領域に領域10と20バイト来る割り当てます

  P2 =(CHAR *)のmalloc(20)。

  strcpyの(P1、「123456」); // 123456 \ 0定常領域で、コンパイラは、所定の場所に「123456」の最適化と、それにポイントをP3かもしれません

  }

  コード・セグメントは、データセグメントは、読み取り専用、データセグメントの読み書き、静的セグメント未初期化データ領域、及び領域は、動的ヒープ及びスタックです。コードセグメントは、連結セグメントの後に生成されたデータセグメント読み取り専用および読み書きデータは、未初期化データ・セクションは、プログラムの初期化、スタック及びヒープ割り当てで開き、プログラムの動作を放出します。C言語プログラムは、2つの状態に分け、および実行時のイメージをしています。コンパイル - 接続した後に形成された画像を、それが唯一のコードセグメント(テキスト)を含むことになる、データ・セグメント(ROデータ)のみを読み取り、データセグメント(RWデータ)を書き込みます。実行する前に、動的に初期化されていないデータセクション(BSS)、動的に形成されたスタック(ヒープ)とプログラム領域の実行時におけるスタック領域(スタック)を生成。一般的に、静的な画像ファイルに、様々な部品(セクション)セクションと呼ばれ、各部分は、実行時間セグメント(セグメント)で呼び出されます。詳細を区別しない場合は、総称して、セグメントと呼ばれます。

  知識ポイント:

  C言語はコンパイルおよびリンクされ、生成されたコードセグメント(テキスト)した後、読み取り専用のデータセグメント(ROデータ)とデータセグメント(RWデータ)を書き込みます。動作時に、上記3つの領域に加えて、さらに初期化されていないデータ・セグメント(BSS)とヒープ領域(ヒープ)とスタック領域(スタック)領域を含みます。

  II:セクションC言語プログラム

  1.コードセグメント(コードまたはテキスト)

  各関数によって生成されたコードセグメントは、各ステートメントの機能は、アセンブラ(決定コンパイラによって寿命およびアーキテクチャ特定のマシンコード)を生成するために、バイナリマシンコードを介して最終的に解明し、あろう。

  2.読み取り専用データセグメント(ROデータ)

  読み取り専用プログラムで使用されるデータから導出されたデータセグメントを、データの部分の特性が動作中に変更する必要がなく、コンパイラが部分に配置された唯一のデータセグメントを読み出します。読み取り専用C言語でのグローバル変数、読み取り専用のプログラムで使用されるなど、ローカル変数、定数、コンパイル時に読み取り専用のデータ領域に配置されます。

  注:[100] = {「ABCDEFG」}チャーグローバル変数CONSTの定義を、結果として生じるサイズは、読み出し専用データ領域100バイトであり、「ABCDEFG」初期化を使用して。以下のように定義されている場合:[] = {「ABCDEFG」}チャーCONST、文字列の長さは8バイトに応じて生成される読み取り専用のデータセグメント(また、「\ 0」)、読み取り専用データセグメントになるように、一般的に私たちは完全な初期化を行う必要があります。

  3.読み取りおよび書き込みデータセグメント(RWデータ)

  読み取りおよび書き込みデータをターゲット・セグメント内のファイルの一部を表して読み取ることができる読み取り専用のデータセグメントが属するように、データ領域を書き込むことができ、いくつかの場合には、それらはまた、データセグメント及びコードセグメントの一部である初期化されたデータ・セグメントとして知られています静的領域のプログラムが、書き込み性の特性を有しています。静的チャーB [100] =関数で{「ABCDEFG」}の定義、プログラム領域にデータを読み書きしなければならない特性が初期化される:典型的には、として、グローバル変数とローカル変数は静的リードに入れ、データセグメントを書き込むれる初期化、場合のみではなく、初期値、書き込みデータ領域が発生せず、未初期化データ領域(BSS)に配置されます。(変数の関数の外に定義される)グローバル変数のみファイル内で使用できることを意味静的修飾を追加した場合、他のファイルにすることはできません。

  4.初期化されていないデータ・セグメント(BSS)

  読み取りと同様に、データセグメントを書き込み、それは静的なデータ領域ですが、セグメント内のデータは初期化されていません。だから、それだけで、実際に対象のファイルのために呼ばれずに、ターゲット・ファイルで識別され、セクションでは、実行時に生成されます。初期化されていないデータセグメントは、操作の初期化フェーズでのみ生成されますので、目標ファイルサイズの大きさに影響を与えることはありません。

  C言語のプログラムでは、以下の変数と同様に注意を払う必要性を使用します。

  関数の本体で定義された1変数は、通常李する処理部プログラム内のスタックの管理を行う必要がありません。

  2.関数のmalloc、のcalloc、reallocのを使用してメモリとヒープ上に割り当てられ、他のメモリ領域を割り当て、プログラムは自由解放の使用、またはメモリリークが発生することを確認する必要があります。

  3.全てのin vitro機能が配置されている内部またはグローバルエリア外かどうかを、関数を添加した後、グローバル変数、静的変数を定義しました。

  4. CONSTは、プログラムの放電領域における変数は、読み取り専用データを定義しました。

  3:の途中でプログラムを使用します

  C言語の変数とセグメントとの対応関係を示すために、ここでは簡単な例。以下のセグメントの実際の数に対応するグローバルゾーン(休止ゾーン)におけるC言語プログラム:ROデータ、RWデータ、BSSデータ。

  変数の初期化は、初期化データ領域(RWデータ)である場合、一般に、未初期化データ領域に直接定義されたグローバル変数は、読み取り専用データ領域CONSTが一緒に配置します。

  [] = {「これはデータのみを読み出される」} ROのconst char型; //読み取り専用データ領域

  静的チャーrw_1 [] = {「これは、グローバルリードライトデータである」}; //初期化データセクションを読ん

  チャーBSS_1 [100]; //未初期化データ・セクション

  * ptrconst =「定数データ」のconst char型; //読み取り専用のデータセグメント内の文字列

  メインint型()

  {

  短いB; //スタックには、2つのバイトを占有します

  [100]チャー; //スタックに100のバイトを開き、その値は最初のアドレスであります

  チャーS [] =「ABCDEFG」; //スタックのS、4バイト、「ABCDEFG」読み出し専用データ記憶領域に自分自身を配置し、8つのバイト

  char * p1の、スタック上// P1、4つのバイト

  するchar * P2 =「123456」; //スタック上P2は、コンテンツへのP2点を変更することができない、「123456」の読み出し専用データ領域

  静的チャーrw_2 [] = {「これは、ローカルリードライトデータが」}; //初期化ローカル読み出しおよび書き込みデータセグメント

  静的チャーBSS_2 [100]; //ローカル未初期化データ・セクション

  静的INT C = 0; //グローバル(静的)ゾーンの初期化

  = P1(CHAR )はmalloc(10はsizeof(CHAR)); //ヒープ領域内のメモリ領域を割り当てます

  strcpyの(P1、「XXXX」)、読み出し専用データ領域内の//「XXXX」は、5を表すバイト

  無料(P1); //空きメモリを使用するには、P1を解放するために指摘しました

  0を返します。

  }

  読み出しおよび書き込みデータメモリセグメントが静的チャーrw_1 []及び初期化グローバル変数を含むローカル静的変数静的rw_2 []。差であることを、関数内で使用されるか、文書全体を通して使用されてもよい場合UNRAVEL。有する又はライトデータ領域に配置されますが、他のファイルが参照されるかどうかであることができる静的変形、無し[] rw_1ため。後者の場合はそうではありません、それはその意味を完全に変え、それはここでは、ローカル変数のスタック領域ではなく、静的変数で開かれます、エリア内に置かれたデータ、そうでない場合は、静的な修正を読み書き、ローカル静的変数でありますrw_1 []、rw_2は[ザ]具体的な値は、判定領域と同じ大きさは、文字列の長さの静的端を表します。

  BSS_1 [100]とBSS_2 [100]のために初期化されていないデータ領域が、前者はグローバル変数であることを除いて、それが全てのドキュメントで使用することができ、後者は、ローカル変数、内部でのみ使用する機能です。初期化されていないデータ・セグメントは、初期値の背後に配置されていない李BSSは、長さに応じてセットのサイズを大きくする必要があるため、面積値の大きさを指定するために使用されなければなりません。

  スタック空間は主に以下の3つのデータを格納するために使用されます。

  1.関数内動的変数

  2.関数のパラメータ

  3.関数の戻り値

  動的なスタック空間が開かれ、再利用されます。あなたはより大きな構造を使用している場合、コール機能時には、関数呼び出しの階層が徐々に増加するのに必要な多くのスタック領域である場合には、パラメータや戻り値を渡すため、スタック領域の使用が比較的大きくなります。

おすすめ

転載: blog.51cto.com/14355585/2413971