C - メモリ管理
この章では、C での動的メモリ管理について説明します。C プログラミング言語には、メモリの割り当てと管理のための関数がいくつか用意されています。これらの関数は
Sr.No. | 機能と説明 |
---|---|
1 | void *calloc(int num, int size); この関数は num の配列を割り当てます それぞれのサイズが size になる要素 . |
2 | void free(void *アドレス); この関数は、アドレスで指定されたメモリ ブロックのブロックを解放します。 |
3 | void *malloc(size_t サイズ); この関数は num の配列を割り当てます バイトを初期化せずに残しておきます。 |
4 | void *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"); /* allocate memory dynamically */ 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 Ali Description: 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"); /* allocate memory dynamically */ 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."); } /* suppose you want to store bigger description */ 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 ); /* release memory using free() function */ free(description); }
上記のコードをコンパイルして実行すると、次の結果が生成されます。
Name = Zara Ali Description: Zara ali a DPS student.She is in class 10th
追加のメモリを再割り当てせずに上記の例を試すことができます。strcat() 関数は、説明に使用可能なメモリが不足しているため、エラーを返します。
C言語