malloc
分配内存块。
语法
void *malloc(
size_t size
);
参数
size
要分配的字节数。
返回值
malloc
会返回指向已分配空间的 void 指针,如果可用内存不足,则返回 NULL
。 若要返回指向类型而非 void
的指针,请在返回值上使用类型转换。 返回值指向的存储空间会适当对齐,以存储对齐要求小于或等于基本对齐要求的任意对象类型。 (在 Visual C++ 中,基本对齐是 double
或 8 个字节所需的对齐。在面向 64 位平台的代码中,是 16 个字节。)使用 _aligned_malloc
为具有更大对齐要求的对象分配存储空间,例如 SSE 类型 __m128
和 __m256
,以及使用 __declspec(align( n ))
(其中 n
大于 8)声明的类型。 如果 size
为 0,则 malloc
在堆中分配零长度的项并向该项返回有效的指针。 即使请求的内存量较小,也要始终检查 malloc
的返回值。
注解
malloc
函数分配至少为 size
个字节的内存块。 由于对齐和维护信息所需的空间,该块可能大于 size
个字节。
如果内存分配失败或请求的内存量超过 _HEAP_MAXREQ
,malloc
会将 errno
设置为 ENOMEM
。 有关此错误代码和其他错误代码的信息,请参阅 errno
、_doserrno
、_sys_errlist
和 _sys_nerr
。
启动代码使用 malloc
为 _environ
、envp
和 argv
变量分配存储空间。 以下函数及其宽字符对应项也调用 malloc
。
C++ _set_new_mode
函数将为 malloc
设置新的处理程序模式。 新的处理程序模式将指示 malloc
是否在失败时调用由 _set_new_handler
设置的新处理程序例程。 默认情况下,malloc
在失败时不调用新的处理程序例程来分配内存。 可以替代此默认行为,以便在 malloc
无法分配内存时,malloc
将以 new
运算符由于相同原因失败时的同一方法调用新的处理程序例程。 要替代默认值,请提前在程序中调用 _set_new_mode(1)
或与 NEWMODE.OBJ
链接(请参阅链接选项)。
当应用程序与调试版的 C 运行时库链接时,malloc
将解析为 _malloc_dbg
。 有关堆在调试过程中如何托管的详细信息,请参阅 CRT 调试堆详细信息。
malloc
标记了 __declspec(noalias)
和 __declspec(restrict)
。 这些属性意味着该函数保证不会修改全局变量,并且返回的指针不使用别名。 有关详细信息,请参阅 noalias
和 restrict
。
默认情况下,此函数的全局状态范围限定为应用程序。 若要更改此行为,请参阅 CRT 中的全局状态。
要求
例程 | 必需的标头 |
---|---|
malloc |
<stdlib.h> 和 <malloc.h> |
有关兼容性的详细信息,请参阅 兼容性。
库
C 运行时库的所有版本。
示例
// crt_malloc.c
// This program allocates memory with
// malloc, then frees the memory with free.
#include <stdlib.h> // For _MAX_PATH definition
#include <stdio.h>
#include <malloc.h>
int main( void )
{
char *string;
// Allocate space for a path name
string = malloc( _MAX_PATH );
// In a C++ file, explicitly cast malloc's return. For example,
// string = (char *)malloc( _MAX_PATH );
if( string == NULL )
printf( "Insufficient memory available\n" );
else
{
printf( "Memory space allocated for path name\n" );
free( string );
printf( "Memory freed\n" );
}
}
Memory space allocated for path name
Memory freed