malloc , free , realloc , calloc , mallopt , mallinfo , mallinfo_heap , alloca , valloc 或 posix_memalign 子例程
用途
提供一组完整的内存分配,重新分配,取消分配和堆管理工具。
库
Berkeley 兼容性库 (libbsd.a)
标准 C 库 (libc.a)
Malloc 子系统 API
malloc
语法 (malloc)
#include <stdlib.h>
size_t Size;
描述 (malloc)
malloc 子例程返回一个指向至少由 Size 参数指定的字节数的内存块的指针。 该块对齐,以便可用于任何类型的数据。 如果 malloc 子例程分配的空间过速,那么会出现未定义的结果。
参数 (malloc)
| 项 | 描述 |
|---|---|
| 大小 | 指定要分配的内存大小 (以字节计)。 |
返回值 (malloc)
成功完成后, malloc 子例程返回一个指向空间的指针,该空间适合于存储任何类型的对象。 如果请求的大小为 0 ,那么 malloc 在正常情况下返回 NULL。 但是,如果程序是使用定义的 _LINUX_SOURCE_COMPAT 宏编译的,那么 malloc 将返回一个有效的指向大小为 0 的空间的指针。
如果由于任何原因无法满足请求,那么 malloc 子例程返回 NULL。
错误代码 (malloc)
| 项 | 描述 |
|---|---|
| ENOMEM | 存储空间不足,无法为请求提供服务。 |
可用
语法 (免费)
#include <stdlib.h>
void * Pointer;
描述 (免费)
free 子例程释放先前由 malloc 子系统分配的内存块。 如果 Pointer 参数不是先前由 malloc 子系统分配的地址,或者如果 Pointer 参数已取消分配,那么会发生未定义的结果。 如果 Pointer 参数为 NULL ,那么不会执行任何操作。
参数 (可用)
| 项 | 描述 |
|---|---|
| POINTER | 指定指向先前由 malloc 子系统分配的空间的指针。 |
返回值 (可用)
free 子例程不返回值。 当使用非零参数成功完成时, realloc 子例程返回一个指向 (可能移动的) 分配空间的指针。 如果 Size 参数为 0 且 Pointer 参数不为空,那么不会执行任何操作。
错误代码 (免费)
free 子例程未设置 errno。
realloc (免费)
语法 (realloc)
描述 (realloc)
realloc 子例程将 Pointer 参数指向的内存对象的大小更改为 Size 参数指定的字节数。 指针 必须指向 malloc 子系统分配例程返回的地址,并且不能先前已取消分配。 如果 指针 不满足这些条件,那么将发生未定义的结果。
内存对象的内容保持不变,直至达到新旧大小中的较小者。 如果不能扩大当前内存对象以满足请求,那么 realloc 子例程获取新的内存对象并将现有数据复制到新空间。 然后释放旧内存对象。 如果无法获取内存对象以容纳请求,那么该对象保持不变。
如果 Pointer 参数为空,那么 realloc 子例程等同于相同大小的 malloc 子例程。
如果 Size 参数为 0 且 Pointer 参数不为空,那么 realloc 子例程等同于相同大小的 free 子例程。
参数 (realloc)
| 项 | 描述 |
|---|---|
| POINTER | 指定先前由 malloc 子系统分配的空间的 指针 。 |
| 大小 | 指定内存对象的新大小 (以字节计)。 |
返回值 (realloc)
当使用非零参数成功完成时, realloc 子例程返回一个指向 (可能移动的) 分配空间的指针。 如果 Size 参数为 0 且 Pointer 参数不为空,那么返回行为等同于 free 子例程的返回行为。 如果 Pointer 参数为空且 Size 参数不为零,那么返回行为等同于 malloc 子例程的返回行为。
错误代码 (realloc)
| 项 | 描述 |
|---|---|
| ENOMEM | 存储空间不足,无法为请求提供服务。 |
calloc
语法 (calloc)
#include <stdlib.h>
描述 (calloc)
calloc子程序为包含NumberOfElements对象的数组分配空间。 ElementSize 参数指定每个元素的大小 (以字节计)。 在分配阵列后,所有位都将初始化为 0。
未指定对 calloc 子例程的连续调用所分配的存储的顺序和连续性。 返回的指针指向已分配空间的第一个 (最低) 字节地址。 分配的空间对齐,以便可用于任何类型的数据。 如果 calloc 子例程分配的空间过速,那么会出现未定义的结果。
参数 (calloc)
| 项 | 描述 |
|---|---|
| NumberOfElements | 指定数组中的元素数。 |
| ElementSize | 指定数组中每个元素的大小 (以字节计)。 |
返回值 (calloc)
成功完成时, calloc 子例程返回一个指向已分配的零初始化数组的指针。 如果请求的大小为 0 ,那么 calloc 子例程在正常情况下返回 NULL。 但是,如果程序是在定义了宏 _LINUX_SOURCE_COMPAT 的情况下编译的,那么 calloc 子例程将返回一个有效的指向大小为 0 的空间的指针。
如果由于任何原因无法满足请求,那么 calloc 子例程将返回 NULL。
错误代码 (calloc)
| 项 | 描述 |
|---|---|
| ENOMEM | 存储空间不足,无法为请求提供服务。 |
mallopt
语法 (mallopt)
描述 (mallopt)
| 命令 | 值 | 影响 |
|---|---|---|
| M_ MXFAST | 0 | 如果在任何其他 malloc 子系统子例程之前调用,那么这将启用进程的缺省分配策略。 |
| M_ MXFAST | 1 | 如果在任何其他 malloc 子系统子例程之前调用,那么这将为进程启用 3.1 分配策略。 |
| M_DISCLAIM | 0 | 如果在启用 "缺省分配器" 时调用,那么将取消声明进程堆中的所有可用内存。 |
| M_MALIGN | N | 如果在运行时调用,请将缺省 malloc 分配对齐设置为值 N。 N 值必须是 2 的幂 (大于或等于指针大小)。 |
参数 (mallopt)
| 项 | 描述 |
|---|---|
| 命令 | 指定要执行的 mallopt 命令。 |
| VALUE | 指定数组中每个元素的大小。 |
返回值 (mallopt)
成功完成时, mallopt 子例程返回 0。 否则,将返回 1。 如果请求了无效对齐 (不是 2 的幂) ,那么 mallopt 将失败,返回值为 1 ,尽管对 malloc 的后续调用不受影响,并继续提供失败的 mallopt 调用之前的对齐值。
错误代码 (mallopt)
mallopt 子例程未设置 errno。
mallinfo
语法 (mallinfo)
#include <malloc.h>
#include <stdlib.h>
描述 (mallinfo)
mallinfo 子例程可用于获取有关由 malloc 子系统管理的堆的信息。
返回值 (mallinfo)
mallinfo 子例程返回类型为 struct mallinfo的结构,其中填充了有关堆的相关信息和统计信息。 可以使用 /usr/include/malloc.h 文件中 struct mallinfo 的定义来解释此结构的内容。
错误代码 (mallinfo)
mallinfo 子例程未设置 errno。
马林福堆
语法 (mallinfo_heap)
#include <malloc.h>
#include <stdlib.h>
描述 (mallinfo_heap)
在多堆上下文中,可以使用 mallinfo_heap 子例程来获取有关由 malloc 子系统管理的特定堆的信息。
参数 (mallinfo_heap)
| 项 | 描述 |
|---|---|
| HEAP | 指定要查询的堆。 |
返回值 (mallinfo_heap)
mallinfo_heap 返回类型为 struct mallinfo_heap的结构,其中填充了有关堆的相关信息和统计信息。 可以使用 /usr/include/malloc.h 文件中 struct mallinfo_heap 的定义来解释此结构的内容。
错误代码 (mallinfo_heap)
mallinfo_heap 子例程未设置 errno。
alloca
语法 (alloca)
#include <stdlib.h>
int Size;
描述 (alloca)
alloca 子例程返回一个指针,该指针指向至少由 Size 参数指定的字节数的内存块。 从调用者的堆栈帧中分配空间,并在调用子例程返回时自动释放空间。
如果在使用 IBM® XL C for AIX® 编译器编译的代码中使用 alloca 子例程,那么在引用 alloca 子例程之前,必须将 #pragma alloca 添加到源代码中。 或者,可以添加 -马 编译器标志或 <alloca.h> 头文件。
参数 (alloca)
| 项 | 描述 |
|---|---|
| 大小 | 指定要分配的内存大小 (以字节计)。 |
返回值 (alloca)
alloca 子例程返回一个指向所请求大小的空间的指针。
错误代码 (alloca)
alloca 子例程未设置 errno。
valloc
语法 (valloc)
#include <stdlib.h>
size_t Size;
描述 (valloc)
valloc 子例程在 Berkeley 兼容性库 (libbsd.a) 以及 libc.a中作为兼容性接口受支持。 valloc 子例程与 malloc具有相同的效果,只是分配的内存与 sysconf (_ SC_PAGESIZE) 返回的值的倍数一致。
参数 (valloc)
| 项 | 描述 |
|---|---|
| 大小 | 指定要分配的内存大小 (以字节计)。 |
返回值 (valloc)
成功完成时, valloc 子例程返回一个指向内存对象的指针,该对象的长度为 Size 字节,与页边界对齐。 如果 valloc 子例程分配的空间过速,那么会出现未定义的结果。
如果由于任何原因无法满足请求,那么 valloc 将返回 NULL。
错误代码 (valloc)
| 项 | 描述 |
|---|---|
| ENOMEM | 存储空间不足,无法为请求提供服务。 |
posix_memalign
语法 (posix_memalign)
#include <stdlib.h>
void ** Pointer2Pointer;
size_t Align;
size_t Size;
描述 (posix_memalign)
posix_memalign 子例程分配在 Align指定的边界上对齐的 Size 字节的内存。 此内存的地址存储在 Pointer2Pointer中。
参数 (posix_memalign)
| 项 | 描述 |
|---|---|
| Pointer2Pointer | 指定应该在其中复制地址的位置。 |
| 对齐 | 指定已分配内存的对齐方式 (以字节计)。 Align 参数必须是指针大小的 2 倍幂。 |
| 大小 | 指定要分配的内存大小 (以字节计)。 |
返回值 (posix_memalign)
成功完成后, posix_memalign 将返回 0。 否则,将返回错误号以指示错误。
错误代码 (posix_memalign)
| 项 | 描述 |
|---|---|
| EINVAL | Align 的值不是指针大小的 2 倍幂。 |
| ENOMEM | 存储空间不足,无法为请求提供服务。 |