C言語の動的メモリ

  1. 概要動的に割り当てられたメモリ

    • アレイ内の章は、配列の長さは、プログラム全体の固定、事前に定義され導入され、実際のプログラミングでは、多くの場合、これは、メモリ要件は、実際の入力データに依存する、すなわち、発生します、および所定ことはできません。上記の問題を解決するために、C言語は、いくつかのメモリ管理機能を提供し、これらのメモリ管理機能を動的に必要なメモリ空間として割り当てることができ、スペースはもはや再びリサイクルません使用することができます

  2. 静的割り当て、動的割り当て

    • 静的割り当て

      • プログラムをコンパイルまたは動作中に、所定のメモリ空間の事前割付割り当てサイズINT [10]に記載

      • あなたは、事前に必要なスペースの大きさを知っている必要があります

      • 一般にアレイの形で、スタック領域またはグローバル変数領域を分配

      • 計画によると配布

    • 動的割り当て

      • プログラムはフリーサイズに必要な必要な領域を割り当て、実行されています

      • 必要に応じて配布

      • 典型的には、特定の分布関数を使用して、ヒープ割り当て、

  3. 動的な割り当て関数

    • 必要なヘッダファイルには、「stdlib.h」をインクルード

    • malloc関数

      • 関数のプロトタイプ:void * malloc関数(unsigned int型のサイズ)

      • 機能

        • ダイナミックメモリの記憶領域(スタック領域)の長さを分配することは、指定されたタイプ記載されたタイプを格納するために使用される連続領域のサイズバイトです。プロトタイプvoid *機能を使うに応じてキャストするポインタを返し、メモリコンテンツ配信の不確実性は、一般的にはmemset初期化を使用していました。

      • 戻り値:アドレス空間の割り当て(割り当て成功)NULL(割り当ての失敗)を起動します

      • 注意:

        • malloc関数を呼び出した後、我々は成功したアプリケーションメモリならば、何を決定する必要があります

        • 複数のmallocメモリアプリケーション場合、第1及び第2のメモリアプリケーションは、必ずしも連続していません

      • 例えば

        • 「stdlib.h」をインクルード

        • 「stdio.hに」を含めます

        • 「string.hのを」を含みます

        • {int型のmain()

        • int型配列*、カウント、N。

        • printf(「あなたは\ nを適用する配列要素の数を入力してください。」);

        • scanf関数( "%のD"、&N);

        • アレイ=(INT *)はmalloc(N *はsizeof(INT))。

        • IF(配列= NULL)

        • {

        • printf( "アプリケーションメモリは失敗しました\ n");

        • 0を返します。

        • }

        • memset(アレイ、0、N *はsizeof(INT))。

        • 以下のために(0 =カウント、カウント値<N;カウント++)

        • {

        • 配列[カウント] =数えます。

        • }

        • 以下のために(0 =カウント、カウント値<N;カウント++)

        • {

        • printf( "%d個の\ n"、アレイ[カウント])。

        • }

        • 無料(配列); //メモリアレイでリリース

        • 0を返します。

        • }

    • フリー機能(メモリ機能を解除するには)

      • 関数定義ボイドのない(ボイド*のPTR)

      • 機能説明:free関数は、ptrが指すメモリを解放します

      • メモリへの注意PTRポイントは、RAMのmallocのcalloc relloc動的なアプリケーションでなければなりません

      • 注意を払います

        • pはまだ元のダイナミックメモリアプリケーションを指すように遊離した後、Pへの割り当てがないので。

        • メモリは何度も無料ではない、一度動的なアプリケーションを解放することができます

    • calloc関数

      • 関数定義void *型のcalloc(size_tの、nmemb個、size_tのサイズ);

      • unsigned int型size_tのは、実際には、それはtypedefを持つから、ファイルのヘッダーにあります

      • 関数関数:ヒープメモリは、各ブロックのアプリケーションnmemb個のブロックサイズは、連続領域のサイズであるバイト

      • 関数の戻り値

        • (アプリケーションが正常に行われた)最初のアドレスのメモリのアプリケーションを返します。

        • 戻り値のNULL(アプリケーション障害)

      • 注:mallocとのcalloc関数は、メモリを割り当てるために使用されています

      • 違い:

        • 関数の名前は同じではありません

        • パラメータの数が同じではありません

        • malloc関数割り当てられたメモリは、メモリコンテンツは、ランダム不透明、及びアプリケーション機能のメモリの内容のcalloc 0に格納されます。

      • メソッドを呼び出します

        • CHAR * P =(CHAR *)のcalloc(3,100)

        • 100バイト、300のバイト、すなわち連続領域の各ブロックサイズのスタック3の適用で

    • relloc関数(再アプリケーションメモリ)

      • 我々は連続呼び出すメモリー関数mallocとのcalloc、単一のアプリケーション、二つのメモリが2回続けて同じアプリケーションではありません、時々私は最初のメモリの一部に適用のmallocかのcallocを使用し、この要求があり、私はまだしたいです元のアプリケーションのメモリ、または私はメモリの一部に適用されるのmallocかのcallocを使用し始めたとき、私はこの問題を解決するために、背後にあるメモリの一部を解放したいと思い、relloc機能の発明

      • 関数が定義されています。void * relloc(void *型の、unsigned int型NewSizeパラメータ)

      • 関数の機能:

        • そして、メモリの後ろには十分でない場合は、メモリのS点に基づいて元のメモリを再適用元のメモリの後ろに十分なスペースがある場合は、その後、新しいメモリサイズはnew_sizeで、それは、追加、そしてrelloc機能、NewSizeパラメータバイトを見つけますメモリ割り当てのサイズ、およびメモリの元の内容をコピーし、新しいメモリアドレスに堆積します

      • 元のメモリよりNewSizeの小さい場合は、元のメモリの後ろの収納スペースを解放。フロントのみNewSizeの戻り値を残して:最初のメモリアドレスの新しいアプリケーション

      • 例えば

        • char * P;

        • P =(CHAR *)のmalloc(100)。

        • //私たちは、100バイト後に追加の50のバイトをしたいです

        • P =(CHAR *)relloc(P、150); // P点新しいメモリサイズには150バイトであります

        •  

        • char * P;

        • P =(CHAR *)のmalloc(100)。

        • //私たちは、新しいサイズが50バイトで、メモリを再申請したいです

        • P =(CHAR *)relloc(P、50); // P点新しいメモリサイズには、バイト50が解放された100バイトの後に、50バイトであります

    • 注:malloc関数のcalloc rellocダイナミックアプリケーションメモリにのみ、無料またはプログラムの終了、それが解放されます

    • メモリリーク

      • メモリリークの概念:

        • アプリケーションメモリ、彼の最初のアドレスを失った、またリリースしていない、使用することができなかった、見つけることができない、このメモリがリークされました。

      • 例えば

        • {int型のmain()

        • char * P;

        • P =(CHAR *)のmalloc(100)。

        • //次に、あなたはメモリがpによって指さ使用することができます

        • P =「こんにちは世界」; // p個のポイントどこかへ

        • //その時から、あなたは、100バイトの動的なアプリケーションが流出した、100バイトのアプリケーションを見つけることができませんでした

        • }

        •  

        • 空の楽しみ(){

        • char * P;

        • P =(CHAR *)のmalloc(100)。

        • //次に、あなたはメモリがpによって指さ使用することができます

        • }

        • {int型のmain()

        • 楽しいです();

        • 楽しいです();

        • 0を返します。

        • //(P)フリーを追加すると、メモリリークを解決し

        • //各呼び出しの楽しみは、100バイトをリーク

        • }

        • 解決策2

        •  

        • CHAR *楽しいです(){

          • char * P;

          • P =(CHAR *)のmalloc(100)。

          • //次に、あなたはメモリがpによって指さ使用することができます

          • Pを返します。

          • }

          • {int型のmain()

          • char * Q;

          • Q =楽しい(); // 100バイトの動的なアプリケーションメモリを用いて、Q

          • //リリースを覚えています

          • 無料(P);

          • //各呼び出しの楽しみは、100バイトをリーク

          • }

    • 概要:メモリ割り当て、失われたの最初のアドレスは、使用しないときにメモリを解放することを確認してはなりません

おすすめ

転載: www.cnblogs.com/fengzi759/p/11618708.html