malloc, calloc, realloc 使用及区别

来源:互联网 发布:笔记本电脑咋下载软件 编辑:程序博客网 时间:2024/06/14 02:52

堆空间

malloc, calloc, realloc 函数分配的空间位于堆空间, C语言内存分布包括栈空间、堆空间、数据段(包括BSS段)、代码段。

这里写图片描述

这里写图片描述

malloc

函数原型: void* malloc (size_t size);
功能:请求系统动态分配size个字节的空间,如果分配成功则返回第一个字节的地址。
返回值:如果重新分配成功则返回指向被分配内存的指针,否则返回空指针。

calloc

函数原型: void* calloc (size_t num, size_t size);
功能:在内存的动态分配区中分配num个长度为size的连续空间。
返回值:如果重新分配成功则返回指向被分配内存的指针,否则返回空指针。
malloc与calloc区别:

  • malloc不能初始化所分配的内存空间,也就是说malloc分配好空间后要对所分配的空间进行清理。而函数calloc会将所分配的内存空间中的每一位都初始化为零。也就是说,如果你是为字符类型或整数类型的元素分配内存,那么这些元素将保证会被初始化为0;如果你是为指针类型的元素分配内存,那么这些元素通常会被初始化为空指针。
  • 函数malloc向系统申请分配指定size个字节的内存空间.返回类型是 void*类型.void*表示未确定类型的指针. void* 类型可以强制转换为任何其它类型的指针.

realloc

函数原型: void* realloc (void* ptr, size_t size);
功能:先判断当前的指针是否有足够的连续空间,如果有,扩大ptr指向的地址,并且将ptr返回,如果空间不够,先按照size指定的大小分配空间,将原有数据从头到尾拷贝到新分配的内存区域,而后释放原来ptr所指内存区域(注意:原来指针是自动释放,不需要使用free),同时返回新分配的内存区域的首地址,即重新分配存储器块的地址。
返回值:如果重新分配成功则返回指向被分配内存的指针,否则返回空指针。
使用总结:

  • realloc失败的时候,返回NULL
  • realloc失败的时候,原来的内存不改变,不会释放也不会移动
  • 假如原来的内存后面还有足够多剩余内存的话,realloc的内存=原来的内存+剩余内存,realloc还是返回原来内存的地址;假如原来的内存后面没有足够多剩余内存的话,realloc将申请新的内存,然后把原来的内存数据拷贝到新内存里,原来的内存将被free掉,realloc返回新内存的地址
  • 如果size为0,效果等同于free()。
  • 传递给realloc的指针必须是先前通过malloc(), calloc(),或realloc()分配的或者空指针
  • 传递给realloc的指针可以为空指针,等同于malloc。

示例

#include "stdio.h"#include "stdlib.h"int main() {    int *a, *b, *c;    a = (int*)malloc(sizeof(int));    *a = 2;    b = (int*)realloc(nullptr, sizeof(int));    *b = 3;    printf("a=%d, b=%d\n", *a, *b);    c = (int*)realloc(a, sizeof(int));    *c = 4;    printf("a=%d, b=%d\n", *a, *b);}

输出结果:

a=2, b=3
a=4, b=3

原创粉丝点击