malloc、alloc和realloc函数的区别

本文介绍了程序执行期间的内存分配,重点讲解了堆和栈的区别,以及C库中malloc、free、calloc和realloc的使用方法和注意事项。通过实例演示动态内存分配和释放的技巧,强调了内存管理在节省资源和避免内存泄漏的重要性。

在程序的执行期间分配内存时,内存区域中的这个空间称为堆(heap)。还有另一个内存区域,称为栈(stack),其中的空间分配给函数的参数和本地变量。在执行完该函数后,存储参数和本地变量的内存空间就会释放。堆中的内存是由程序员控制的。在分配堆上的内存时,由程序员跟踪所分配的内存何时不再需要,并释放这些空间,以便于以后重用它们。

 使用动态内存很明显的好处就是:不需要预先分配存储空间且分配的空间可以根据程序的需要扩大或缩小,这样可以有效的使用内存空间。

malloc和free

 C函数库中的malloc和free分别用于执行动态内存分配和释放。这两个函数的原型如下所示,他们都在头文件stdlib.h中声明。

 void *malloc ( size_t size );

 void free ( void *pointer );

 malloc的作用是在内存的动态存储区中分配一个长度为size的连续空间。其参数是一个无符号整形数,返回值是一个指向所分配的连续存储域的起始地址的指针。还有一点必须注意的是,当函数未能成功分配存储空间(如内存不足)就会返回一个NULL指针。所以在调用该函数时应该检测返回值是否为NULL,确保非空之后再使用非常重要。malloc所分配的内存是一块连续的空间。同时,malloc实际分配的内存空间可能会比你请求的多一点,但是这个行为只是由编译器定义的。malloc不知道用户所请求的内存需要存储的数据类型,所以malloc返回一个void *的指针,它可以转换为其它任何类型的指针。

 由于内存区域总是有限的,不能不限制地分配下去,而且一个程序要尽量节省资源,所以当所分配的内存区域不用时,就要释放它,以便其它的变量或者程序使用。这时我们就要用到free函数。free的参数必须要么是NULL,要么是从malloc、relloc、calloc返回的值。作用是释放之前返回的指针指向的内存空间,向free传递一个NULL参数不会产生任何效果。

calloc和realloc与malloc的区别

 calloc和realloc的原型如下:

 void *calloc ( size_t num_elements, size_t element_size );

 void *realloc (void *ptr, size_t new_size );

 calloc和malloc 主要的区别在于前者在返回内存的指针之前将它初始化为0,另外它们请求数量的方式不同。calloc的参数包括所需元素的数量和每个元素的字节,根据这些值可以计算出总共需要分配的内存空间。

 realloc函数用于修改一个原先已经分配的内存块的大小,可以使一块内存的扩大或缩小。当起始空间的地址为空,即*ptr = NULL,则同malloc。当*ptr非空:若nuw_size < size,即缩小*ptr所指向的内存空间,该内存块尾部的部分内存被拿掉,剩余部分内存的原先内容依然保留;若nuw_size > size,即扩大*ptr所指向的内存空间,如果原先的内存尾部有足够的扩大空间,则直接在原先的内存块尾部新增内存,如果原先的内存尾部空间不足,或原先的内存块无法改变大小,realloc将重新分配另一块nuw_size大小的内存,并把原先那块内存的内容复制到新的内存块上。因此,使用realloc后就应该改用realloc返回的新指针。

使用方法程序示例

复制代码
复制代码
1 int ptr =NULL;
2 ptr = (int
)malloc(sizeof(int)*size);
3 if (ptr == NULL)
4 {
5 strerror(error);
6 return;
7 }
复制代码
复制代码
上例中动态分配了size个整型存储区域。动态分配内存的步骤可细分为:分配size个整型的连续存储空间,并返回一个指向其起始地址的整型指针把此整型指针地址赋给ptr, 检测返回值是否为NULL。注意,类型转换(int
)将函数返回的地址转换成int类型的指针。这么做是因为malloc()是一般用途的函数,可为任何类型的数据分配内存。sizeof是一个运算符,它返回一个size_t类型的无符号整数,该整数是存储它的参数需要的字节数。它把关键字如int或float等作为参数,返回存储该类型的数据项所需的字节数。它的参数也可以是变量或数组名。把数组名作为参数时,sizeof返回存储整个数组所需的字节数。前一个例子请求分配足以存储size个int数据项的内存。以这种方式使用sizeof,可以根据不同的C编译器为int类型的值自动调整所需的内存空间。

1 int *p1,p2;
2 p1 = (int
)malloc(size * sizeof(int));
3 p2=p1;
4 ……
5 free(p1); /或者free(p2)/
给free函数传递其它的值很可能造成死机或其它灾难性的后果。注意:这里重要的是指针的值,而不是用来申请动态内存的指针本身。

 malloc返回值赋给p1,又把p1的值赋给p2,所以此时p1,p2都可作为free函数的参数。malloc函数是对存储区域进行分配的。 free函数是释放已经不用的内存区域的。 所以由这两个函数就可以实现对内存区域进行动态分配并进行简单的管理了。

下面是使用动态分配的内存的基本规则:

●避免分配大量的小内存块。分配堆上的内存有一些系统开销,所以分配许多小的内存块比分配几个大内存块的系统开销大。

●仅在需要时分配内存。只要使用完堆上的内存块,就释放它。

●总是确保释放已分配的内存。在编写分配内存的代码时,就要确定在代码的什么地方释放内存。

●在释放内存之前,确保不会无意中覆盖堆上分配的内存的地址,否则程序就会出现内存泄漏。在循环中分配内存时,要特别小心。

<think>我们正在讨论C语言中的内存分配函数。用户询问allocmalloc区别。请注意,在标准C库中,有malloc、callocrealloc等,但没有一个名为alloc函数。因此,用户可能是指calloc(因为calloc有时被简称为alloc,尽管不准确)或者是指某个特定系统/框架中的alloc函数(如Objective-C中的alloc方法)。但根据常见情况,我们假设用户指的是标准C中的callocmalloc区别。 标准C中: - malloc: 分配指定字节数的内存,不初始化内存内容(内容是未定义的)。 - calloc: 分配指定数量大小的内存块,并将所有位初始化为0。 因此,回答将围绕这两个函数区别展开。 回答结构: 1. 明确两个函数的标准存在(malloccalloc)。 2. 解释两者的函数原型参数含义。 3. 对比它们在分配行为上的不同(初始化与否)。 4. 使用场景建议。 注意:如果用户指的是其他情况(比如某些非标准库中的alloc),但我们这里按照标准C来回答。 然后,按照要求,在回答最后提出3-5个相关问题。 </think> 在 C 语言中,`alloc` 不是标准库函数,通常指代的是 `calloc`(动态内存分配函数)。以下是 **`malloc` 与 `calloc`** 的核心区别: | 特性 | `malloc` | `calloc` | |--------------|-----------------------------------|-----------------------------------| | **函数原型** | `void* malloc(size_t size);` | `void* calloc(size_t num, size_t size);` | | **内存初始化** | 不初始化内存(内容随机) | 自动初始化为零(所有位设为 `0`) | | **参数含义** | 参数为总字节数(如 `malloc(100)`)| 参数为元素数量单个元素大小(如 `calloc(25, sizeof(int))`) | | **使用场景** | 需手动初始化的场景 | 需要零初始化内存的场景(如数组) | | **性能** | 略快(不执行初始化) | 略慢(需执行内存清零) | ### 示例代码 ```c // malloc 示例:分配 10 个 int 空间(未初始化) int *arr1 = (int*)malloc(10 * sizeof(int)); if (arr1) { // 需手动初始化 memset(arr1, 0, 10 * sizeof(int)); } // calloc 示例:分配 10 个 int 空间(自动初始化为0) int *arr2 = (int*)calloc(10, sizeof(int)); // 内存已清零 ``` ### 关键注意事项 1. **返回值检查**:两者都可能返回 `NULL`(内存不足时),使用前必须验证指针 2. **内存释放**:均需用 `free()` 释放 3. **错误用法**:`calloc(num, size)` 等价于 `malloc(num * size)` + 自动清零,但更安全避免乘法溢出
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值