Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

C言語のrealloc関数とは?動的メモリ再確保の使い方をわかりやすく解説

C言語の標準ライブラリに含まれるメモリ割り当て関数 void *realloc(void *ptr, size_t size) は、malloccalloc で事前に確保したメモリブロックのサイズを変更(拡張・縮小)するための関数です。

メモリ確保には2つの方法がある

C言語におけるメモリ確保は、大きく分けて以下の2つの方法があります。

静的メモリ確保(コンパイル時)

  • コンパイル時にメモリが確保されるため、実行中にそのサイズを変更することはできません。
  • 必要な量を事前に正確に予測できないため、メモリが不足したり、逆に余分な領域が無駄になったりする問題が発生します。

動的メモリ確保(実行時)

  • プログラムの実行中に、ユーザーの要求に応じて必要な分だけメモリを確保できます。
  • これにより、静的確保における「不足」や「無駄」の問題を回避できます。

動的メモリ管理のための標準ライブラリ関数

C言語では、以下の標準ライブラリ関数を使って動的にメモリを管理します。

  • malloc() — 指定したバイト数のメモリを確保する
  • calloc() — 複数の要素分のメモリを確保し、0で初期化する
  • realloc() — 既存のメモリブロックのサイズを変更する
  • free() — 確保したメモリを解放する

realloc() 関数の特徴

  • すでに確保済みのメモリを再確保するために使用します。
  • 確保されたメモリは拡大も縮小も可能です。
  • 戻り値として、再確保されたメモリブロックの先頭アドレスを指す void型ポインタ を返します。失敗した場合は NULL を返します。

realloc() の構文

void *realloc(void *pointer, size_t newsize);

第一引数には malloc/calloc/realloc で取得したポインタを、第二引数には新しいサイズを指定します。

realloc() の基本的な使い方

次のコードは、realloc() 関数の典型的な使用例を示しています。

int *ptr;
ptr = (int *) malloc(1000); // calloc でも可
- - -
- - -
// メモリを500バイトへ縮小
ptr = (int *) realloc(ptr, 500);
- - -
- - -
// メモリを1500バイトへ拡張
ptr = (int *) realloc(ptr, 1500);

サンプルプログラム:配列サイズを実行中に拡張する

以下は、realloc() を使って配列の要素数を5から7へ動的に拡張するCプログラムの例です。

#include<stdio.h>
#include<stdlib.h>
int main(){
    int *ptr, i, num;
    printf("array size is 5\n");
    ptr = (int*)calloc(5, sizeof(int));
    if(ptr==NULL){
        printf("Memory allocation failed");
        exit(1); // プログラムを終了
    }
    for(i = 0; i < 5; i++){
        printf("enter number at %d: ", i);
        scanf("%d", ptr+i);
    }
    printf("\nLet's increase the array size to 7\n ");
    ptr = (int*)realloc(ptr, 7 * sizeof(int));
    if(ptr==NULL){
        printf("Memory allocation failed");
        exit(1); // プログラムを終了
    }
    printf("\n enter 2 more integers\n\n");
    for(i = 5; i < 7; i++){
        printf("Enter element number at %d: ", i);
        scanf("%d", ptr+i);
    }
    printf("\n result array is: \n\n");
    for(i = 0; i < 7; i++){
        printf("%d ", *(ptr+i) );
    }
    return 0;
}

実行結果

上記のプログラムを実行すると、次のような出力が得られます。

array size is 5
enter number at 0: 23
enter number at 1: 12
enter number at 2: 45
enter number at 3: 67
enter number at 4: 20
Let's increase the array size to 7
enter 2 more integers
Enter element number at 5: 90
Enter element number at 6: 60
result array is:
23 12 45 67 20 90 60

まとめ

realloc() を使えば、プログラム実行中に必要に応じてメモリサイズを柔軟に調整できます。ただし、戻り値が NULL になる可能性もあるため、必ずNULLチェックを行い、失敗時の処理を実装することが重要です。また、不要になったメモリは free() で適切に解放し、メモリリークを防ぎましょう。

  1. C言語のstrcmp()関数とは?文字列比較の基本と使い方を徹底解説

    C言語の標準ライブラリ関数 int strcmp(const char *str1, const char *str2) は、ポインタ str1 が指し示す文字列と、str2 が指し示す文字列を比較するための関数です。C言語において、文字型の配列は「文字列」と呼ばれます。まずは文字列の基本的な扱い方から確認していきましょう。文字列の宣言文字列(文字配列)の宣言は以下のように行います。char stringname [size];例えば、char string[50]; と宣言すれば、最大50文字の長さを持つ文字列を格納できます。文字列の初期化文字列の初期化には、主に次の2つの方法があります。1

  2. C#プログラミングとは?初心者にもわかる特徴と基本を徹底解説

    C#(シーシャープ)とは何かC#は、Microsoft(マイクロソフト)が開発したモダンで汎用性の高いオブジェクト指向プログラミング言語です。Windowsアプリケーションの開発をはじめ、Webサービス、ゲーム開発(Unity)、業務システムなど、幅広い分野で活用されています。C#は「共通言語基盤(CLI:Common Language Infrastructure)」向けに設計されています。CLIは実行可能なコードとランタイム環境から構成されており、これにより異なるコンピュータプラットフォームやアーキテクチャ上で、さまざまな高水準言語を利用できるようになっています。C#の主な特徴C#には、開