C言語(メモリ管理)

メモリ空間を初期化する

#include <malloc.h>インポートヘッダーファイル

  memset:一定のバイトでメモリ空間を埋める
  memcpy:メモリ空間をコピーする
  memmove:メモリ空間をコピー
  するmemcmp:メモリ空間を比較するmemchr:メモリ空間で
  文字を検索
    する文字列を処理している場合は、 'mem'の先頭を 'str'に変更します。これはメモリ空間を処理するためのものなので、


柔軟なメモリ管理

void * malloc(size_t size); // 動的メモリ空間に適用する;(voidは任意のタイプのデータに変換できます)
 // 関数:システムに適用して、メモリ空間のsizeバイトを割り当て、この空間へのポインタを返しますたとえば、 :
Int * ptr =(int *)mallocsizeofint)); // ヒープメモリ

void  freevoid * ptr); // 動的メモリ空間を解放;
 // 動的に適用されたメモリ空間がヒープに存在するため、それがアクティブに解放されない場合は、プログラムが閉じるまで保存されます
 // ロール:ptrパラメーターが指すメモリー空間を解放します(malloc、calloc、realloc関数によってスペースを適用する必要がある
 場合)// 注:パラメーターがNULLの場合は実行しないでください任意の操作。その呼び出しは、まだ元の場所を指しているの後にこの関数は、PTRパラメータの値を変更しない
 // 初期化されなければならないC言語の変数で定義されている。実際にはアドレス、破壊されていない事実に格納されたアドレスのデータを使用する権利を解放しますそれ以外の場合、データは変数アドレスが前回使用したガベージデータです。

void * calloc(size_t nmemb、size_t size); // 一連のメモリ空間を適用して初期化します
 // 関数:長さsazeのnmemb連続メモリ空間に適用し、0に初期化します;つまり:
int * ptr =(int *)calloc(N、sizeofint)); // int * ptr =(int *)と同等
malloc(N * sizeofint )); 
memset(ptr、0、N * sizeofint )); void * reallocvoid * ptr、size_t size); //

メモリスペースの再割り当て(通常は動的な拡張に使用されます)
 // 関数:ptrは再割り当てされたスペースを指し、古いメモリブロックを解放して新しいスペースにデータをコピーします
。ptrパラメータがNULLの場合、malloc(size );
 // サイズパラメータは0であり、ptrパラメータはNULLではありません。これはfree(ptr)を呼び出すことと同じです

注:ptrパラメーターがNULLでない場合、彼はmalloc、calloc、reallocによって動的に割り当てられたスペースでなければなりません。


メモリリーク

  プログラムに割り当てられたスペースが動的に適用されるため、プログラムは強制終了されます

    1.暗黙的なメモリリーク(使用済みのメモリブロックがfree関数で時間内に解放されない);
    2.メモリブロックアドレスが失われる(割り当てられたアドレスが失われるため、使い切った後、時間内に解放できない)


メモリレイアウトルール

  保存された上位アドレスに低いから: - >セグメント- > BSSセグメント-コード・セグメント>ヒープ- >スタック・
    コード・セグメント:一般的に維持するために使用指す放電領域コードの実行の期間を、プログラムが実行される前に決定されている。
    データセグメント:通常、初期化されたグローバル変数とローカル静的変数を格納するために使用されます ;
    bssセグメント:通常、プログラム内の初期化されていないグローバル変数のメモリ領域を格納するために使用されます(実行前に自動的に0に初期化されます)
    ヒープ:プロセスの動作中に動的に割り当てられたメモリセグメントを格納するため使用されます。サイズは固定されておらず、動的に拡大および縮小できます。(動的アプリケーションおよびメモリの解放)
    スタック関数が実行されるメモリ領域、通常はヒープと同じ領域を共有する(ローカル変数、関数パラメーター、関数の戻り値

  ヒープとスタックの違い:
    アプリケーション:ヒープの手動適用;スタックはシステムによって自動的に割り当てられます;
    リリース:ヒープの手動適用;スタックはシステムによって自動的に解放されます;
    ライフサイクル:ヒープはアクティブに解放されるまで動的に適用されます;つまり、呼び出し元の関数に戻ると、呼び出し元の関数を引き続き使用できます。)スタックは関数呼び出しから始まり、関数が戻ったときに終了します(関数間のローカル変数は相互にアクセスできません)
    開発の方向:ヒープは他のセクションと同様ですアドレスから高アドレスへの開発、
    スタックはその逆で、高アドレスから低アドレスへの開発(プッシュスタック)。


メモリプール

  動的に適用されたメモリを解放する場合、最初にメモリプールに配置すると、次回メモリを適用するときにメモリプールのメモリを直接使用できます。メモリ
  を動的に適用する場合、プログラムはメモリにアクセスする必要があるため、効率が低下します。 ;

  (単一リンクリストで利用可能)
—————————————————————————————————————————————— ---------
ビットフィールド

  占有バイナリ番号を指定します1バイトが8バイナリビットを占有します);(int型とboolean型のサポートビットフィールドのみ)
    unsigned int a:2;ここのステートメントは署名できず、最大で2つのバイナリビットを占有します=> 3への
  注意:ビットフィールドの幅は、それが基づいている型の長さを超えることはできません[上記のintは、最大で32のバイナリビットしか占有しません]

おすすめ

転載: www.cnblogs.com/TianLiang-2000/p/12712454.html