返回首页   进站必读

7.3 动态内存分配


7.3.1 malloc 和 free

进程有一个堆空间,C标准库函数malloc可以在堆空间动态分配内存,它的底层通过brk系统调用向操作系统申请内存。 动态分配的内存用完之后可以用free释放,更准确地说是归还给malloc,这样下次调用malloc时这块内存可以再次被分配。

用法:

#include <stdlib.h>
void *malloc(size_t size);
返回值:成功返回所分配内存空间的首地址,出错返回NULL;
void free(void *ptr);

注意:malloc的参数size表示要分配的字节数,如果分配失败(可能是由于系统内存耗尽)则返回NULL。 由于malloc函数不知道用户拿到这块内存要存放什么类型的数据,所以返回通用指针void *, 用户程序可以转换成其它类型的指针再访问这块内存。malloc函数保证它返回的指针所指向的地址满足系统的对齐要求, 例如在32位平台上返回的指针一定对齐到4字节边界,以保证用户程序把它转换成任何类型的指针都能用。

示例:

// 分配一块区域,输入一个学生数据。

#include <stdio.h>
#include <stdlib.h>

int main(int argc, const char *argv[])
{
	struct stu
	{
		int num;
		char *name;
		char gender;
		float score;
	} *ps;

	ps = (struct stu*)malloc(sizeof(struct stu));
	ps->num = 102;
	ps->name = "Zhang ping";
	ps->gender = 'M';
	ps->score = 62.5;

	printf("Number = %d\nName = %s\n", ps->num, ps->name);
	printf("Gender = %c\nScore = %f\n", ps->gender, ps->score);

	free(ps);

	return 0;
} 

7.3.2 calloc 和 realloc

calloc的参数很像fread/fwrite的参数,分配nmemb个元素的内存空间,每个元素占size字节, 并且calloc负责把这块内存空间用字节0填充,而malloc并不负责把分配的内存空间清零。

用法:

#include <stdlib.h>

void *calloc(size_t nmemb, size_t size);
void *realloc(void *ptr, size_t size);
返回值:成功返回所分配内存空间的首地址,出错返回NULL

7.3.3 alloca

alloca函数不是在堆上分配空间,而是在调用者函数的栈帧上分配空间,类似于C99的变长数组, 当调用者函数返回时自动释放栈帧,所以不需要free。

用法:

#include <alloca.h>

void *alloca(size_t size);
返回值:返回所分配内存空间的首地址,如果size太大导致栈空间耗尽,结果是未定义的