进程有一个堆空间,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;
}
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
alloca函数不是在堆上分配空间,而是在调用者函数的栈帧上分配空间,类似于C99的变长数组, 当调用者函数返回时自动释放栈帧,所以不需要free。
用法:
#include <alloca.h>
void *alloca(size_t size);
返回值:返回所分配内存空间的首地址,如果size太大导致栈空间耗尽,结果是未定义的