C

C中calloc和malloc函数的区别

Posted by Sim on May 18, 2016

一般的内存区域可以分为堆(heap), 栈(stack), 静态存储区(全局),常量存储区还有程序代码区。其中

  • 栈 – 由编译器自动分配释放,用于存放函数的参数值和局部变量等

  • 堆 – 由程序员进行分配释放

  • 静态存储区 – 全局变量和静态变量的存储区。初始化完成变量在一块区域,未进行初始化的在其相邻的区域。由程序负责释放

  • 常量存储区 – 存储常量

C中提供了许多函数来完成堆上内存的管理,比方说calloc()malloc()

malloc()

void *malloc(int n)可以从堆上获得指定字节的内存空间。其中n为分配的字节数,一般情况下会使用sizeof()函数来获取单位大小。函数执行成功的话,会返回内存空间的首地址,如果执行失败的话,返回值为NULL。由于其类型为void型指针,因此可以将其值类型转换后赋给任意类型的指针。从而操作堆上的内存空间

calloc()

void *calloc(int n, int size)功能与malloc()类似都是从堆上分配内存。与malloc()的区别在于,malloc()分配获取的空间是未进行初始化的,还需要调用memset()来将其初始化为0.而calloc()得到的内存空间是经过初始化的,其内容全为0.所以比较适合用于为数组申请空间,可以将size设置为数组元素的空间长度,n为数组的容量

free()

void free(void *p)释放指针所指向的内容,但是该指针仍然指向原来指向的地方,所以在释放之后,需要将指针设为NULL