Cメモリ管理


この章では、C での動的メモリ管理について説明します。 C 言語には、メモリの割り当てと管理のためのいくつかの関数が用意されています。これらの関数は、<stdlib.h> ヘッダー ファイルにあります。

シリアル番号関数と説明
1void *calloc(int num, int size);
この関数はnum要素を含む配列を割り当てます。各要素のサイズはsizeですバイト。
2void free(void *address);
この関数は、アドレスが指す h メモリ ブロックを解放します。
3void *malloc(int num);
この関数は num バイトの配列を割り当て、初期化します。
4void *realloc(void *address, int newsize);
この関数はメモリを再割り当てし、メモリを newsize まで拡張します。

メモリを動的に割り当てる

プログラミングの際、配列のサイズが事前にわかっていると、配列の定義が簡単になります。たとえば、人の名前を保存する配列の場合、最大 100 文字を保持できるため、次のように配列を定義できます:

char name[100];

ただし、保存する必要があるテキストの長さが事前にわからない場合は、たとえば、トピックに関する詳細情報を保存したい場合は、説明します。ここでは、以下に示すように、メモリ サイズが未定義の文字を指すポインタを定義し、需要に応じてメモリを割り当てる必要があります:

#include <stdio.h>#include <stdlib.h>#include <string.h>int main(){   char name[100];   char *description;

   strcpy(name, "Zara Ali");   /* 动态分配内存 */
   description = malloc( 200 * sizeof(char) );   if( description == NULL )   {
      fprintf(stderr, "Error - unable to allocate required memory\n");   }   else   {
      strcpy( description, "Zara ali a DPS student in class 10th");   }
   printf("Name = %s\n", name );
   printf("Description: %s\n", description );}

上記のコードがコンパイルされて実行されると、次の結果が生成されます:

Name = Zara AliDescription: Zara ali a DPS student in class 10th

上記のプログラムは、calloc()を使用して記述することもできます。以下に示すように、malloc を calloc に置き換えるだけです:

calloc(200, sizeof(char));

メモリを動的に割り当てる場合、完全な制御があり、任意のサイズの値を渡すことができます。サイズが事前定義された配列は、一度定義するとサイズを変更できません。

メモリのサイズ変更と解放

プログラムが終了すると、オペレーティングシステムはプログラムに割り当てられたすべてのメモリを自動的に解放しますが、必要がないときはいつでも関数free()を呼び出してメモリを解放することをお勧めします。記憶。

あるいは、関数 realloc() を呼び出して、割り当てられたメモリ ブロックのサイズを増減することもできます。 realloc() 関数と free() 関数を使用して上記の例をもう一度見てみましょう:

#include <stdio.h>#include <stdlib.h>#include <string.h>int main(){   char name[100];   char *description;

   strcpy(name, "Zara Ali");   /* 动态分配内存 */
   description = malloc( 30 * sizeof(char) );   if( description == NULL )   {
      fprintf(stderr, "Error - unable to allocate required memory\n");   }   else   {
      strcpy( description, "Zara ali a DPS student.");   }   /* 假设您想要存储更大的描述信息 */
   description = realloc( description, 100 * sizeof(char) );   if( description == NULL )   {
      fprintf(stderr, "Error - unable to allocate required memory\n");   }   else   {
      strcat( description, "She is in class 10th");   }
   
   printf("Name = %s\n", name );
   printf("Description: %s\n", description );   /* 使用 free() 函数释放内存 */
   free(description);}

上記のコードがコンパイルされて実行されると、次の結果が生成されます:

Name = Zara AliDescription: Zara ali a DPS student.She is in class 10th

追加のメモリを再割り当てせずに試すことができます。説明を保存するために使用できるメモリが不足しているため、strcat() 関数はエラーを生成します。