C/C++動的記憶割当てmalloc calloc realloc関数の使い方と違い


一、前言
動的記憶割当関数ヘッダファイルmalloc.h(ANSI規格ではstdlib.hが推奨されていますが、多くのコンパイラではサポートされていない可能性があります)は、メモリ領域のスタック上のメモリの管理を実現するために多くの関数を提供しています.主に次のとおりです.
void *malloc(unsigned int num_bytes);
void *realloc(void* mem_address,unsigned int newsize);
void *calloc (size_t nmemb, size_t size);
二、使い方
1.malloc関数
      
パラメータが与えられたバイト数のメモリ領域を割り当て、ポインタを返すと理解される場合は、ポインタタイプを人為的に定義する必要があります.
例:
     int * p =null;
     p= (int *) malloc(sizeof(int) * 10);
上記の文は、実際には、スタックから40バイトのメモリ領域(intは4バイト、すなわち10 intの大きさ)が動的に割り当てられており、pはこの空間のヘッダアドレスを返し、もちろん関数の実行に失敗した場合nullを返す.ここで得られるメモリ領域は、関数memsetを使用して初期化することができる.
     memset(p , 0 , sizeof(int)*10);
テストコード:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>

int main(int argc , char* argv[])
{
     int * p= NULL;
     p = (int *) malloc( sizeof(int) * 10 );
     memset(p, 0, sizeof(int) * 10 );
     int a;
     int i;
     for(i = 0;i < 10;i++)
     {
          a = *(p+i);
          printf("a = %d\r
",a); } free(p); return 0; }

2.calloc関数
mallocと同様に、2番目のパラメータは割り当てられるバイト単位のサイズを表し、1番目のパラメータは、p=(int*)calloc(10,sizeof(int);は、10乗sizeof(int)バイトである40バイトの空間を割り当て、mallocとは異なり、メモリを動的に割り当てた後、自動的に初期化されるメモリ空間はゼロである.もちろん、実行が正常にポインタヘッダアドレスを返すと、実行は正常にNULLを返すことはできません.
テストコード:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>

int main(int argc , char* argv[])
{
     int * p= NULL;
     //p = (int *) malloc( sizeof(int) * 10 );
     //memset(p, 0, sizeof(int) * 10 );
     p = (int *)calloc(10, sizeof(int));
     //   memset     
     int a;
     int i;
     for(i = 0;i < 10;i++)
     {
          a = *(p+i);
          printf("a = %d\r
",a); } free(p); return 0; }

3.realloc関数
例えば、p=realloc(p,n);
最初のパラメータは、スタック内で動的に割り当てられたメモリを指します.2番目のパラメータは再割り当てのサイズを表し(パラメータが0の場合、NULLが返され、ポインタが解放されるわけではない)、実際にはこの関数は主に動的割り当て領域を拡大するために使用され、すなわち、2番目のパラメータnが1番目のパラメータpが指す動的メモリサイズより大きい場合、nのサイズの空間を再申請し、前の空間をスタックに返す.
テストコード:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>

int main(int argc , char* argv[])
{
     int * p= NULL;
     int * q= NULL;
     p = (int *)malloc (sizeof (int) * 5);
     q = p ;//             
     printf("before realloc.\r
"); printf("p=%p q=%p\t
",p,q); p = (int *)realloc(p, sizeof(int) * 10); printf("after realloc.\r
"); printf("p=%p q=%p\r
",p,q); free(p); free(q); return 0; }

注意:コード・ノートに記載されているセキュリティ上の危険性の参考:http://blog.csdn.net/snlying/article/details/4005238