c malloc calloc realloc

3855 ワード

mallocとfree関数のプロトタイプは次のとおりです.
void *malloc(size_t size);
void free(void *pointer);

mallocのパラメータは、割り当てが必要なメモリバイト数です.メモリプールで使用可能なメモリがこの要件を満たす場合、mallocは割り当てられたメモリブロックの開始位置を指すポインタを返します.mallocが割り当てたメモリは連続したメモリです.要求が満たされない場合、mallocはNULLポインタを返すので、mallocから返されるポインタごとにNULLではないことを確認する必要があります.(ダイナミックメモリ割り当ての一般的なエラーは、要求されたメモリが割り当てられたかどうかを確認するのを忘れることです).チェック例:
int *p;
p = (int*)malloc(100);
if(p==NULL){
    printf("Out of memory!
"
); exit(1); }

NULLはstdioで定義する.hでは,実際には字面値定数0である.freeのパラメータはNULLか、malloc、calloc、reallocから以前に返された値です.フリーにNULLを渡すと何の効果も得られません.freeに渡されるポインタはmalloc/calloc/reallocから返されるポインタでなければなりません.free関数にポインタを渡し、非動的に割り当てられたメモリを解放すると、プログラムがすぐに終了したり、後で終了したりする可能性があります.
callocおよびrealloc関数のプロトタイプは次のとおりです.
void *calloc(size_t num_elements,size_t element_size);
void realloc(void *p,size_t new_size);

callocとmallocの違いは、callocがメモリを0に初期化することであり、この初期化が便利になることが多いことです.もう1つの違いは、callocのパラメータには、要素の数と、各要素が占有するバイト数の2つがあります.例:
     int * p=NULL;// 5 int
     p=(int *)calloc(SIZE,sizeof(int));
     if(NULL==p){
         printf("Error in calloc.
"
); return -1; }

realloc関数は、既存の(割り当て)メモリブロックのサイズを変更するために使用されます.この関数を使用すると、メモリを拡大または縮小できます.連続メモリブロックが大きすぎると、元のメモリが再割り当てされ、コピーされます.次の例を参照してください.
    int* a = malloc(sizeof(int)*10);
    int* b;
    a[0] = 1;
    b = realloc(a,sizeof(int)*20);
    if(a==NULL){
        printf("a out of memory
"
); exit(1); } if(b==NULL){ printf("b out of memory
"
); exit(1); } printf("%d
"
,a); printf("%d
"
,b); //a,b , 120 printf("%d
"
,b[0]); // 1

本文はCとポインタから