C言語,realloc()関数で確保したメモリ領域のサイズを変更

スポンサーリンク

鍛錬 736

C言語,realloc()関数で確保したメモリ領域のサイズを変更する

malloc()関数やcalloc()関数で動的に確保したメモリ領域について、サイズを変更してメモリ領域の再割り当てを行うには、realloc()関数を使用します。
 
以下は、realloc()関数についてです。

#include <stdlib.h>

void *realloc(void *ptr, size_t size);
 

 
確保したメモリ領域は、free()関数で解放する必要があります。

引数

以下は、上記の引数についてです。

引数 意味
void *ptr 確保済みのメモリに対するポインタ
size_t size 新しく確保するバイトサイズ

戻り値

以下は、戻り値についてです。

戻り値
void 成功 新しく割り当てられたメモリに対するポインタ
エラー NULL
スポンサーリンク

プログラム

以下は、確保済みのメモリ領域について、サイズを変更して再度メモリ領域を割り当てるプログラム、test_realloc.c です。

今回は、char サイズのメモリを 256 個確保後に、512個へとサイズを変更しています。

// include
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// main
int main(void)
{
	char *p, *ptmp;
	int nmem;
	
	// 256個(charサイズ)のメモリを確保
	nmem = 256;
	p = (char *)malloc(sizeof(char) * nmem);
	if (p == NULL) {
		printf("ERROR,malloc\n");
		exit(EXIT_FAILURE);
	}
	
	// 文字列を格納
	memcpy(p, "Hello", 5);
	p[5] = '\0';
	printf("文字列[%s], アドレス[%p]\n", p, p);
	
	// サイズを変更してメモリ領域を再割り当て
	printf("\n---------- realloc() 実行 ----------\n\n");
	nmem = 512;
	ptmp = (char *)realloc(p, sizeof(char) * nmem);
	if (ptmp == NULL) {
		printf("ERROR,realloc\n");
		free(p);
		exit(EXIT_FAILURE);
	}
	p = ptmp;
	
	printf("文字列[%s], アドレス[%p]\n", p, p);
	
	// メモリ解放
	free(p);
	
	return 0;
}
スポンサーリンク

実行結果

以下は、プログラム test_realloc.c を実行しています。

***@ubuntu:~/***/test/c$ 
***@ubuntu:~/***/test/c$ gcc -Wall -Wextra test_realloc.c -o test_realloc
***@ubuntu:~/***/test/c$ ./test_realloc
文字列[Hello], アドレス[0x5630391de260]

---------- realloc() 実行 ----------

文字列[Hello], アドレス[0x5630391de780]

 
上記に示した通り、サイズを変更してメモリ領域を再度割り当てることができました。

タイトルとURLをコピーしました