#navi(../) * 動的メモリサイズを拡張する・realloc [#j3a8b1a9] malloc関数を使用することにより指定したサイズ(バイト)のメモリを取得することができます。~ その後、取得したメモリサイズを拡張したい場合は、realloc関数を使用することによりメモリサイズを広げることができます。 以下にC言語のサンプルソースと実行例を記します。 #author("2017-04-30T10:48:58+09:00","","") #contents #htmlinsertpcsp(c-top.html,c-sp.html) *関連記事 [#f86bbdf6] -[[メモリの内容を指定した値で初期化する・memset>メモリ/メモリの内容を指定した値で初期化する・memset]] -[[メモリ内容をコピーする・memcpy>メモリ/メモリ内容をコピーする・memcpy]] -[[構造体の内容をコピーする・memcpyは使わない!>メモリ/構造体の内容をコピーする・memcpyは使わない!]] -[[メモリの比較を行う・memcmp>メモリ/メモリの比較を行う・memcmp]] -[[動的にメモリを取得する・malloc>メモリ/動的にメモリを取得する・malloc]] -[[動的メモリサイズを拡張する・realloc>メモリ/動的メモリサイズを拡張する・realloc]] -[[指定した文字数分コピーする・memmove>メモリ/指定した文字数分コピーする・memmove]] -[[指定したバイトの指定個数分メモリを確保する・calloc>メモリ/指定したバイトの指定個数分メモリを確保する・calloc]] * realloc書式など [#r87bea36] realloc関数の書式などを以下に記します。 -インクルードが必要なファイル #include <stdlib.h> -reallocの書式 void *realloc(void *ptr, size_t size); -戻り値~ 拡張したあとのメモリの先頭アドレス -引数~ 1つ目: mallocで取得済みのポインタ~ 2つ目: 取得するサイズ * reallocのCサンプルコード [#l9b996ac] 以下にreallocを使ったCサンプルコードを記します。~ 最初に5バイト+1バイト(NULL)のエリアを確保し、12345をstrcpyを使って確保したメモリにセットしています。~ 次に更に5バイト拡張し、67890をstrcatを使って文字列連結しています。~ 表示後、free関数にてmalloc,reallocで取得したメモリを解放しています。 &ref(realloc.c); (改行コードLF) #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> int main(void) { char *p = NULL; p = malloc(5+1); if (p == NULL) { perror("malloc() error!"); exit(EXIT_FAILURE); } strcpy(p, "12345"); printf("p = %s\n", p); p = realloc(p,10+1); strcat(p, "67890"); printf("p = %s\n", p); return 0; } 上記Cサンプルコードをコンパイルし実行した結果です。 $ gcc realloc.c -o realloc $ ./realloc p = 12345 p = 1234567890 サンプルソースで+1している理由は、文字列の終端のNULLが格納されるエリア(1バイト)を追加しています。~ 以上、reallocによる動的メモリの取得のサンプルコードでした。 #htmlinsertpcsp(c-btm.html,c-sp.html)