>> C言語関数一覧トップに戻る
今回はC言語のrealloc関数について説明します。
realloc関数は確保したメモリの割り当てを変更する関数です。
■書式
#include <stdlib.h>
void *realloc(void *ptr, size_t size);
第一引数に確保したメモリのポインタ
第二引数に変更後のメモリサイズ
を指定します。
戻り値は新しく確保されたメモリのポインタが返ります。
失敗時はNULLが返ります。
realloc関数は以前に確保したメモリの位置から拡張できるのであれば、そのアドレスから拡張しますが、
拡張できなかった場合別のアドレスに確保しなおします。
拡張できれば、以前のデータは保持されていますが、
別の場所に確保された場合は以前のデータは保持されない可能性が高いです。
また、以前確保したメモリよりも少なく割り当てすることもできます。
その場合は以前のデータは保持されますが、少なくなった分は削られます。
■サンプルコード
文字列「ABCDE」、アドレス「002E1480」
文字列「ABCDE」、アドレス「002E1480」
上記のコードでは、確保しなおしたメモリが違う領域に確保された場合は、
新アドレスにそのデータをコピーした後、以前のメモリ領域を解放しています。
逆に、同じアドレスから拡張できた場合は何もせずにそのまま表示しています。
今回の場合は同じアドレスから拡張できたので、そのまま表示しています。
「%p」書式指示子はメモリのアドレスを表示する指示子です。
そのまま拡張されたのか、新しい領域に確保されたのかを必ずチェックしておかないと
予期せぬエラーに悩まされることがあります。
必ずチェックするようにしましょう。
>> 【C言語 memchr 使い方】に進む
>> C言語関数一覧トップに戻る
C言語 realloc 使い方
realloc関数は確保したメモリの割り当てを変更する関数です。
■書式
#include <stdlib.h>
void *realloc(void *ptr, size_t size);
第一引数に確保したメモリのポインタ
第二引数に変更後のメモリサイズ
を指定します。
戻り値は新しく確保されたメモリのポインタが返ります。
失敗時はNULLが返ります。
realloc関数は以前に確保したメモリの位置から拡張できるのであれば、そのアドレスから拡張しますが、
拡張できなかった場合別のアドレスに確保しなおします。
拡張できれば、以前のデータは保持されていますが、
別の場所に確保された場合は以前のデータは保持されない可能性が高いです。
また、以前確保したメモリよりも少なく割り当てすることもできます。
その場合は以前のデータは保持されますが、少なくなった分は削られます。
■サンプルコード
#include <stdio.h> #include <stdlib.h> #include <string.h> int main(void) { char *ch; char *ch2; //確保 ch = (char*)calloc(1,100); //文字を格納。 sprintf(ch,"ABCDE"); //メモリに格納した文字列とそのアドレスを表示 printf("文字列「%s」、アドレス「%p」\n",ch,ch); //割り当てなおす ch2 = (char*)realloc(ch,300); //もし確保し直したメモリが違うアドレスだったら前のメモリブロックを解放 if(ch2 != ch){ //解放前に新アドレスにコピーしとく memcpy(ch2,ch,100); free(ch); } //新しく割り当てたメモリの文字列とアドレスを表示 printf("文字列「%s」、アドレス「%p」\n",ch2,ch2); //新しく確保したメモリ解放 free(ch2); return 0; }■実行結果
文字列「ABCDE」、アドレス「002E1480」
文字列「ABCDE」、アドレス「002E1480」
上記のコードでは、確保しなおしたメモリが違う領域に確保された場合は、
新アドレスにそのデータをコピーした後、以前のメモリ領域を解放しています。
逆に、同じアドレスから拡張できた場合は何もせずにそのまま表示しています。
今回の場合は同じアドレスから拡張できたので、そのまま表示しています。
「%p」書式指示子はメモリのアドレスを表示する指示子です。
そのまま拡張されたのか、新しい領域に確保されたのかを必ずチェックしておかないと
予期せぬエラーに悩まされることがあります。
必ずチェックするようにしましょう。
>> 【C言語 memchr 使い方】に進む
>> C言語関数一覧トップに戻る