C语言中malloc,calloc,realloc,free的语法与作用

四个函数的声明分别是:

        void* realloc(void* ptr, unsigned newsize);

        void* malloc(unsigned size);

        void* calloc(size_t nelem, size_t elsize);

        free(q);                       //其中q为已经分配的块;

 

四个函数都被包含在stdlib.h函数库内。

 C语言的标准内存分配函数:malloc,calloc,realloc等

malloc与calloc的区别为1块与n块以及是否初始化的区别:

malloc调用形式为(类型*)malloc(size):在内存的动态存储区中分配一块长度为"size"字节的连续区域,返回该区域的首地址。如果内存没有分配好,则返回值是NULL。对于分配到的内存块并没有进行初始化操作。这块内存可能包含任何随机的垃圾,你可以马上用有效数据或者至少是用零来初始化这块内存。要用0初始化,可以用void *memset(void *s, int c, size_t n);
malloc用于申请一段新的地址,参数size为需要内存空间的长度,如:
char* p;
p=(char*)malloc(20); //这里有一个显示类型转化,由void*转化为char*

calloc调用形式为(类型*)calloc(n,size):在内存的动态存储区中分配n块长度为"size"字节的连续区域,返回首地址。对于分配到的内存块初始化为0,无需要使用memset初始化。有经验的程序员更喜欢使用calloc(),因为这样的话新分配内存的内容就不会有什么问题,调用calloc()肯定会清0。
calloc与malloc相似,参数sizeOfElement为申请地址的单位元素长度,numElements为元素个数,如:
char* p;
p=(char*)calloc(20,sizeof(char));

realloc 不能保证重新分配后的内存空间和原来的内存空间指在同一内存地址, 它返回的指针很可能指向一个新的地址。
  所以,在代码中,必须把realloc返回的值,重新赋给 p 如:
  p = (char *) realloc (p, old_size + new_size);
  
  甚至,你可以传一个空指针(0)给 realloc ,则此时realloc 作用完全相当于malloc。
  int* p = (char *) realloc (0,old_size + new_size); //全新分配一个内存空间,作用完全等同于以下这行: int* p = (char *) malloc(old_size + new_size);
  
  calloc(len, size)与malloc相似,参数len为申请地址的单位元素长度,size为元素个数,如:
  char* p;
  p=(char*)calloc(sizeof(char),1000);


对realloc的详细语法说明:

void *realloc( void *memblock, size_t size );

一、如果memblock = 0, size != 0,表示为空指针分配空间,同malloc(memblock, size)
二、如果memblock != 0, size = 0,表示将已分配的空间释放,同free(memblock)
三、如果memblock != 0, size != 0,表示将已分配的空间重新分配,
1。如果size < memblock已分配内存大小,则将memblock的后部分切除,返回指针和memblock相等。
2。如果size > memblock已分配内存大小,
a)并且memblock大小和其后的自由内存总和大于等于size,则分配size大小的内存,返回指针和memblock相等。
b)如果memblock大小和其后的自由内存总和小于size,则在其他地方分配size大小的内存,返回指针和memblock不相等。如果其他地方也没有足够空间分配内存,则返回指针NULL。

free(p)操作的结果是:指针p指向的地址没变,但地址处的数据此时已经无定义了。即,指针还在,但是数据已经被释放了。

你可能感兴趣的:(malloc)