C语言入门小册子
完成条件
对于简单的程序,声明一个给定大小的数组是可以的:
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_t
在 stdio.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