对于简单的程序,声明一个给定大小的数组是可以的:

char buffer[1024];

但在更复杂的程序中,这可能会导致问题。因为可能无法预知程序执行时需要多大的数组,所以使用固定大小的数组要么会导致内存浪费,要么就不足以完成任务。

解决这个问题的方法是让程序在运行时分配内存,这就是 malloc() 库函数的作用。例如,我们使用 malloc() 分配一个 char 类型的数组:

/* malloc.c */

#include <stdio.h>
#include <stdlib.h>  /* 包含 "malloc" 和 "exit" 函数 */

int main()
{
    char *p;  /* 指向数组的指针 */
    unsigned count;  /* 数组的大小 */

    puts( "数组的大小是多少?" );
    scanf( "%d", &count );  /* 获取数组大小(字节) */
    p = malloc( (size_t)count );  /* 分配内存 */
    if( p == NULL )  /* 检查是否分配失败 */
    {
        puts( "内存分配失败!" );
        exit( 0 );
    }
    puts( "分配的数组!" );
    free( p );  /* 释放内存 */
    return 0;
}

此代码中需要包含头文件 stdlib.h,并声明一个指向分配内存块的指针。malloc() 函数通过以下方式设置指针:

p = malloc( (size_t)count );

count 以字节为单位,并且会被转换为 size_t 类型,size_tstdio.h 中定义。malloc() 返回一个类型为 void * 的指针,可以赋值给任何其他指针类型,而不需要强制转换。在 ANSI C 中,malloc() 返回一个 void * 类型的指针。

如果 malloc() 无法分配内存,它将返回 NULL(在 stdio.h 中定义)。

分配其他数据类型的内存也很简单:

int *buf;
...
buf = malloc( (size_t)sizeof( int ) );

sizeof() 函数用来确定 int 数据类型占用的字节数。

当程序不再需要使用内存块时,可以使用 free() 函数释放它:

free( p );

C 还包含两个与 malloc() 紧密相关的内存分配函数:calloc()realloc()calloc() 函数与 malloc() 执行相同的操作,但它允许通过元素个数来指定分配的内存块大小:

void *calloc( size_t <number_elements>, size_t <sizeof_element_type> );

realloc() 函数则用于重新分配已经分配过的数组的大小:

void *realloc( void *<block_pointer>, size_t <size_in_bytes> );
最后修改: 2025年01月28日 星期二 00:07