C言語のrealloc()活用ガイド:構文、ベストプラクティス、実例
realloc()とは
realloc()は、既に割り当てられたメモリブロックのサイズを変更するC標準ライブラリ関数です。ブロックを拡張・縮小しながら内容を保持するため、実行時に必要サイズが変わる場合の動的メモリ管理を効率化します。
構文
ptr = realloc(ptr, newSize);
ptrは以前に割り当てられたブロックを指し、newSizeは希望サイズ(バイト)です。呼び出し後、ptrは新しいブロックの先頭を指します。再割り当て成功時、元のデータが新しい場所にコピーされ、古いブロックは解放されます。
覚えておくべき重要ポイント
realloc()成功時、戻りポインタは元のアドレスと同じ場合も、新しいアドレスの場合もある- 失敗時は
NULLを返し、元のブロックはそのまま残る - 失敗時に元のアドレスを失わないよう、結果は必ず一時変数に受け取る
- 成功後はポインタを1回だけfreeする
例 — 文字列バッファのリサイズ
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void) {
char *buf = malloc(10);
if (!buf) {
perror("malloc");
return EXIT_FAILURE;
}
strcpy(buf, "Programming");
printf("%s\n", buf);
char *tmp = realloc(buf, 20); // バッファサイズを拡大
if (!tmp) {
free(buf); // 元ブロックは有効なまま
perror("realloc");
return EXIT_FAILURE;
}
buf = tmp;
strcat(buf, " in C");
printf("%s\n", buf);
free(buf);
return EXIT_SUCCESS;
}
例 — 整数配列の割り当てとリサイズ
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int *arr = malloc(10 * sizeof(int));
if (!arr) {
perror("malloc");
return EXIT_FAILURE;
}
/* ... 配列を使用 ... */
int *tmp = realloc(arr, 50 * sizeof(int));
if (!tmp) {
free(arr);
perror("realloc");
return EXIT_FAILURE;
}
arr = tmp;
printf("Array resized successfully\n");
free(arr);
return EXIT_SUCCESS;
}
実践的なヒント
- サイズ引数には符号関連バグを避けるため
size_tを使用 - ブロックを縮小する場合、新しいサイズを超えるデータは破棄される
- ポインタ使用前に必ず戻り値をチェック
- 成功した割り当てごとに
free()をちょうど1回呼ぶ
C言語
- 消火器の安全な使用タイミングと方法:必須ガイド
- ペイントスプレーヤーを極める:均一で安全な塗装のためのプロガイド
- サーミスタを使った温度測定: Arduinoステップバイステップガイド
- カッターグラインダー技術の習得:実践ガイド
- Azure DevOps活用:デリバリー加速のための実証済みプラクティス
- モリブデンが現代産業を形作る仕組み:用途、利点、需給動向
- 完成パズルをエポキシ樹脂でタイムレスな傑作に変える
- C言語のcalloc():ゼロ初期化メモリ割り当てと実践例
- C言語free()関数完全マスター:実践ガイドと例
- VHDLにおける不純関数の活用:FSMの可読性と保守性向上
- VHDL関数マスター:効率的な設計のための実践ガイド