この記事のポイント
この記事では、realloc関数について初心者向けに詳しく解説します。以下の内容について学べます。
- 既存のメモリサイズを変更するrealloc関数の基本機能
- メモリ拡張や縮小を行う具体的な構文の記述方法
- 配列やデータ構造で活用できる実践的なプログラム例
これらのポイントをおさえることで、C言語でのメモリ管理をより柔軟に行えるようになります。
realloc関数とは?
realloc関数は、C言語でメモリの動的確保において、すでに確保したメモリブロックのサイズを変更するために使用される関数です。この関数を使うことで、プログラム実行中にメモリサイズを拡張したり縮小したりできます。
realloc関数は「reallocation」の略で、再割り当てという意味があります。メモリが不足した場合や、使用量に応じてサイズを調整したい場合に便利な機能となります。新しいサイズが元のサイズより大きい場合、元のデータは保持されたまま新しい領域が追加され、小さい場合は不要な部分が解放されます。
【関連】
C言語をもっと詳しく学ぶならpaizaラーニング
基本構文
realloc関数を使用する基本的な構文は、既存のポインタと新しいサイズを指定する形になります。以下のコード例で、その使い方を確認してみましょう。
基本的な記述方法では、第一引数に変更対象のポインタ、第二引数に新しいサイズを指定します。realloc関数はvoid型ポインタを返すため、適切な型にキャストして使用します。メモリ確保に失敗した場合はNULLが返されるため、必ずエラーチェックを行うことが大切です。
また、realloc関数が成功した場合、元のポインタは無効になる可能性があるため、戻り値を新しいポインタとして使用する必要があります。
#include <stdio.h>
#include <stdlib.h>
int main() {
int *ptr = malloc(5 * sizeof(int));
ptr = realloc(ptr, 10 * sizeof(int));
if (ptr != NULL) {
printf("メモリ拡張成功\n");
}
free(ptr);
return 0;
}
出力結果
メモリ拡張成功
実用例
ここからは、realloc関数を実際に使用する具体的なコード例を紹介します。メモリ管理が必要なさまざまな場面での活用方法を学ぶことで、実践的なプログラミング技術を身に付けられます。
各サンプルコードでは、realloc関数の特性を活かした効果的な使用方法を示しており、それぞれ異なる用途での応用例となっています。これらの例を参考に、自分のプログラムでもrealloc関数を適切に活用できるようになりましょう。
メモリ拡張による配列サイズ変更
配列のサイズが実行時に不足した場合、realloc関数を使って動的にメモリを拡張できます。
この例では、最初に3つの要素を持つ配列を作成し、後から6つの要素を持つように拡張しています。元のデータは保持されたまま、新しい領域に追加データを格納できます。
#include <stdio.h>
#include <stdlib.h>
int main() {
int *array = malloc(3 * sizeof(int));
array[0] = 1; array[1] = 2; array[2] = 3;
array = realloc(array, 6 * sizeof(int));
array[3] = 4; array[4] = 5; array[5] = 6;
for (int i = 0; i < 6; i++) {
printf("%d ", array[i]);
}
free(array);
return 0;
}
出力結果
1 2 3 4 5 6
文字列バッファの動的調整
文字列の長さに応じて、バッファサイズを調整する際にrealloc関数が活用できます。文字列バッファのサイズを小さく始めて、必要に応じて拡張することで、メモリ使用量を効率的に管理できます。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
char *buffer = malloc(10);
strcpy(buffer, "ネコ");
buffer = realloc(buffer, 50);
strcat(buffer, "とイヌがいます");
printf("%s\n", buffer);
free(buffer);
return 0;
}
出力結果
ネコとイヌがいます
整数配列の要素追加
プログラムの実行中に整数配列に要素を追加したい場合の実装例です。この方法により、プログラムの進行に合わせて配列サイズを柔軟に変更できます。
#include <stdio.h>
#include <stdlib.h>
int main() {
int *numbers = malloc(sizeof(int));
int size = 1;
numbers[0] = 100;
size = 4;
numbers = realloc(numbers, size * sizeof(int));
numbers[1] = 200; numbers[2] = 300; numbers[3] = 400;
for (int i = 0; i < size; i++) {
printf("%d ", numbers[i]);
}
free(numbers);
return 0;
}
出力結果
100 200 300 400
構造体配列の管理
構造体を格納する配列のメモリ管理にもrealloc関数が利用できます。構造体配列でも同様にrealloc関数を使用して、動的にサイズを調整できます。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
char name[10];
int age;
} Animal;
int main() {
Animal *pets = malloc(sizeof(Animal));
pets = realloc(pets, 2 * sizeof(Animal));
strcpy(pets[0].name, "トリ"); pets[0].age = 2;
strcpy(pets[1].name, "ウサギ"); pets[1].age = 3;
printf("%s: %d歳\n", pets[0].name, pets[0].age);
printf("%s: %d歳\n", pets[1].name, pets[1].age);
free(pets);
return 0;
}
出力結果
トリ: 2歳
ウサギ: 3歳
メモリ縮小によるサイズ最適化
不要になったメモリ領域を解放するため、realloc関数でサイズを縮小する例です。必要な分だけのメモリを使用することで、システムリソースを効率的に活用できます。
#include <stdio.h>
#include <stdlib.h>
int main() {
int *data = malloc(10 * sizeof(int));
for (int i = 0; i < 3; i++) {
data[i] = i + 1;
}
data = realloc(data, 3 * sizeof(int));
for (int i = 0; i < 3; i++) {
printf("%d ", data[i]);
}
free(data);
return 0;
}
出力結果
1 2 3
まとめ
realloc関数は、プログラムの実行中にメモリサイズを動的に変更できる便利な機能です。適切に使用することで、メモリ効率の良いプログラムを作成できます。
realloc関数の活躍する場面
- データ量が実行時に決まる配列処理
- 文字列バッファの動的サイズ調整
- 構造体配列の要素数変更
重要なポイント
- エラーチェックを必ず実装すること
- 戻り値を適切に処理すること
- メモリリークを防ぐfree処理
realloc関数を使いこなすことで、C言語でのメモリ管理がより柔軟になります。ただし、使用する際はメモリリークやポインタの管理に注意し、安全なプログラムを心がけることが大切です。この記事で紹介したコード例を参考に、実際のプログラム開発でreallocを活用してみてください。適切な使用により、効率的で信頼性の高いプログラムを作成できるでしょう。
レベルを更に上げたい方はpaizaプログラミングスキルチェックへ