malloc、calloc、realloc的区别

一般来说,我们可以简单的把内存分为三个部分:

   (1)堆(heap也称堆栈):由malloc系列函数(malloc、realloc、calloc等)或new操作符分配的内存。其生命周期由free或delete决定。在没有释放之前一直存在,直到程序结束。其特点时使用灵活,空间较大,但容易出错。

   (2)栈(stack):保存局部变量。栈上的内容只在函数范围内存在,当函数运行结束之后,这些内容会被自动销毁。其特点是效率高,但是空间有限。

   (3)静态区:保存自动全局变量和staic变量(包括static全局和局部变量)。静态区的内容在整个程序的生命周期都存在,由编译器在编译的时候分配。


  由malloc、realloc、calloc所申请的内存就在堆上,都需要由free释放,不然会造成内存泄漏甚至程序崩溃。
 三者函数原型

1:malloc的函数原型:void *malloc( size_t size );

2:calloc的函数原型(参数分别为第一个元素数目,第二个元素大小):
void *calloc( size_t num, size_t size );

3:realloc的函数原型 (要扩充的参内存大小的指针名,新的大小):
void *realloc( void *memblock, size_t size );

区别:

   (1)malloc不能初始化所申请的内存空间,而calloc能够。

这里写图片描述

   (2)realloc可以对给定的指针所指的空间进行扩大或者缩小,无论是扩张或是缩小,原有内存的中内容将保持不变.当然,新申请的空间的大小如果小于原来的大小,就会导致数据丢失。

这里写图片描述

    (3)realloc申请的内存后面还有足够多剩余内存的话,realloc的内存=原来的内存+剩余内存,realloc还是返回原来内存的地址; 假如原来的内存后面没有足够多剩余内存的话,realloc将申请新的内存,然后把原来的内存数据拷贝到新内存里,原来的内存将被free掉,realloc返回新内存的地址。当给realloc设置的参数指针若为NULL或者0时就相当于malloc的作用



   (4)calloc所申请的空间内容初始化,如果你是为字符类型或整数类型的元素分配内存,那么这些元素将保证会被初始化为0;如果你是为指针类型的元素分配内存,那么这些元素通常会被初始化为空指针;如果你为实型数据分配内存,则这些元素会被初始化为浮点型的零.
malloc、callocrealloc都是C语言中用于动态内存分配的函数,它们之间的区别如下: 1. malloc函数:用于分配指定大小的内存块,返回指向该内存块起始地址的指针。该函数只分配内存,不会对内存进行初始化。 2. calloc函数:用于分配指定数量、指定大小的内存块,返回指向该内存块起始地址的指针。该函数会将分配的内存块全部初始化为0。 3. realloc函数:用于重新分配之前已经分配的内存块的大小,返回指向该内存块起始地址的指针。如果原先分配的内存块大小不足以存储新的数据,realloc函数会重新分配一块新的内存块,并将原先内存块中的数据复制到新的内存块中,然后释放原先的内存块。 下面是三个函数的使用示例: 1. malloc函数的使用示例: ```c #include <stdio.h> #include <stdlib.h> int main() { int *p = (int*)malloc(sizeof(int)); // 分配一个int类型的内存块 if (p == NULL) { printf("malloc failed\n"); return -1; } *p = 10; // 给内存块赋值 printf("%d\n", *p); // 输出内存块的值 free(p); // 释放内存块 return 0; } ``` 2. calloc函数的使用示例: ```c #include <stdio.h> #include <stdlib.h> int main() { int *p = (int*)calloc(1, sizeof(int)); // 分配一个int类型的内存块,并将其初始化为0 if (p == NULL) { printf("calloc failed\n"); return -1; } printf("%d\n", *p); // 输出内存块的值 free(p); // 释放内存块 return 0; } ``` 3. realloc函数的使用示例: ```c #include <stdio.h> #include <stdlib.h> int main() { int *p = (int*)malloc(sizeof(int)); // 分配一个int类型的内存块 if (p == NULL) { printf("malloc failed\n"); return -1; } *p = 10; // 给内存块赋值 printf("%d\n", *p); // 输出内存块的值 p = (int*)realloc(p, sizeof(int) * 2); // 重新分配内存块的大小 if (p == NULL) { printf("realloc failed\n"); return -1; } *(p + 1) = 20; // 给新的内存块赋值 printf("%d %d\n", *p, *(p + 1)); // 输出两个内存块的值 free(p); // 释放内存块 return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值