C動的メモリ割り当てのいくつかの関数の簡単な説明


calloc(), malloc(), realloc(), free()
void *calloc(size_t nobj, size_t size);nobjのsizeサイズのオブジェクトからなる配列に十分なメモリを割り当て、割り当てられた領域の最初のバイトを指すポインタを返します.メモリが足りない場合はNULLを返す.この空間の初期化サイズは0バイトである.
char *p = (char *) calloc(100, sizeof(char));void *malloc(size_t size);sizeサイズのオブジェクトに十分なメモリを割り当て、割り当てられた領域の最初のバイトを指すポインタを返します.メモリが足りない場合はNULLを返す.割り当てられた空間を初期化する.char *p = (char *) malloc(sizeof(char));void *realloc(void *p, size_t size);pが指すオブジェクトのサイズをsizeバイトに変更する.新しく割り当てられたメモリが元のメモリより大きい場合、元のメモリの内容は変わらず、増加する空間は初期化されない.新しく割り当てられたメモリが元のメモリより小さい場合、新しいメモリは元のメモリの内容を保持し、増加する空間は初期化しない.新しい割り当て空間へのポインタを返します.メモリが不足するとNULLを返し、元のpが指すメモリ領域は変わらない.char *p = (char *) malloc(sizeof(char));p= (char *) realloc(p, 256);void free(void *p);pが指すメモリ空間を解放する.pがNULLの場合は機能しない.p必ずcalloc,mallocまたはreallocを呼び出す.free(p);
reallocについて
プロトタイプ:extern void*realloc(void*mem_address,unsigned int newsize);
使用法:#include一部のコンパイラはinclude
機能:mem_を変更するaddressが指すメモリ領域のサイズはnewsize長です.
説明:再割り当てに成功すると、割り当てられたメモリへのポインタが返されます.そうしないと、空のポインタNULLが返されます.メモリが使用されなくなった場合はfree()関数を使用してメモリブロックを解放します.
注:元のメモリのデータはそのままです.
例:
// realloc.c

#include <syslib.h>

#include <alloc.h>

main()

{

    char *p;

    clrscr(); // clear screen

    p=(char *)malloc(100);

   if(p)

       printf("Memory Allocated at: %x",p);

   else

      printf("Not Enough Memory!/n");

   getchar();

   p=(char *)realloc(p,256);

   if(p)

      printf("Memory Reallocated at: %x",p);

   else

      printf("Not Enough Memory!/n");

   free(p);

   getchar();

   return 0;

}


 
詳細説明と注意ポイント:1、mem_を拡大するのに十分なスペースがある場合addressが指すメモリブロックは、追加のメモリを割り当てmem_を返します.addressはここで「拡大」と言います.reallocはスタックからメモリを割り当てていることを知っています.メモリ空間を拡大すると、realloc()はスタックに既存のデータの後ろのバイトから追加のバイトを直接獲得しようとします.もし満足できれば、自然に天下が平らになります.すなわち、元のメモリサイズの後に十分な空き領域が割り当てられている場合、元の領域サイズ=newsizeを加える.ではOKです.得られたのは連続したメモリです.
2、元のメモリサイズの後ろに十分な空き容量がない場合は、スタックからnewsizeサイズのメモリを別途探します.元のサイズのメモリスペースの内容をnewsizeにコピーします.新しいmem_を返しますaddressポインタ.(データが移動されました).古い塊は山に戻された.例:#includechar     *p,*q;p = (char * ) malloc (10);q=p;p = (char * ) realloc (p,20);…………………………このプログラムはコンパイラの中で通過できないかもしれません.コンパイラは私たちのためにいくつかの隠れた危険を解消する可能性がありますから.ここでは、元のメモリアドレスを記録するポインタqを1つ増やして、元のメモリアドレスpを記録しただけで、不幸にもデータが移動すると、記録された元のメモリアドレスqが指すメモリ空間は実際にスタックに戻されます!これで、私たちはやっと問題の所在と恐ろしいことに気づいただろう.
3、返却状況はvoidタイプのポインタを返し、呼び出しに成功した.(必要に応じて強制タイプ変換を行います)NULLを返します.拡張が必要なサイズ(2番目のパラメータ)が0で、1番目のパラメータがNULLではない場合、元のメモリは「freed(遊離)」になります.NULLを返します.拡張できる十分なスペースがない場合、元のメモリスペースのサイズは維持されます.
4、特殊な場合mem_addressがnellの場合、realloc()はmalloc()と似ています.newsizeのメモリブロックを割り当て、メモリブロックへのポインタを返します.newsizeサイズが0の場合、mem_を解放します.addressが指すメモリはnullを返します.再割り当て(元のメモリブロックを拡大するか、新しいメモリブロックを割り当てる)を完了するのに十分なメモリがない場合はnullを返します.元のメモリブロックは変わらない.
回転元:http://blog.csdn.net/DOoDOo_GinGin/article/details/2705710