为什么要用malloc函数申请内存空间?

  有的程序往往在运行时才知道要动态分配多大的内存,例如: 

void foo(char *str, int n)
{
  char buf[?];
  strncpy(buf, str, n);
  ......
}

  n是由参数传进来的,事先不知道是多少,那么buf该定义多大呢?如果我们希望动态分配一块全局的内存空间,在各函数中都可以访问呢?由于全局数组无法定义成VLA,所以任然不不能满足要求,进程有一个堆空间,C标准库函数malloc可以在堆空间动态分配内存,它的底层通过brk系统调用向操作系统申请内存。动态分配的内存用完之后可以用free释放,更准确地说是归还给malloc,这样下次调用malloc时这块内存可以再次被分配。

malloc函数用法:

#include <stdlib.h>

void *malloc(size_t size);//返回值:成功返回所分配内存空
void free(void *ptr);

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

  例子:

#include <stdio.h>
#include <stdlib.h>
#include <string.h> typedef struct {
int number;
char *msg;
} unit_t; int main(void)
{
unit_t *p = malloc(sizeof(unit_t));
if (p == NULL) { printf("out of memory\n");
exit(1);
} p->number = 3;
p->msg = malloc(20); strcpy(p->msg, "Hello world!");
printf("number: %d\nmsg: %s\n", p->num>msg); free(p->msg);
free(p); p = NULL;
return 0;
}

内存泄露:

  简单的程序即使不用free释放内存也可以,因为程序退出时,整个进程地址空间都会释放,包括堆空间,该进程占用的所有内存都会归还给操作系统。但如果一个程序长年累月运行(例如网络服务器程序),并且在循环或递归中调用malloc分配内存,则必须有free与之配对,分配一次就要释放一次,否则每次循环都分配内存,分配完了又不释放,就会慢慢耗尽系统内存,这种错误称为内存泄漏。另外,malloc返回的指针一定要保存好,只有把它传给free才能释放这块内存,如果这个指针丢失了,就没有办法free这块内存了,也会造成内存泄漏。

  

最新文章

  1. 在C#代码中应用Log4Net(一)简单使用Log4Net
  2. SVN命令模式批量更新多个项目
  3. 运用CSS和JS写的大图轮播-带箭头
  4. 游戏 标签gui.label
  5. windows tomcat 优化
  6. mac下Android开发环境搭建
  7. html5相关
  8. amcharts简单封装
  9. 剑指OFFER之数值的整数次方(九度OJ1514)
  10. NET下RabbitMQ实践[实战篇]
  11. 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(14)-系统小结
  12. DAT文件怎样打开
  13. Xcode中插件的安装以及Xcode升级后插件实效的解决方法
  14. 学习HTML5一周的收获4
  15. Oracle结合Mybatis实现取表中前10条数据
  16. javaweb学习--jsp
  17. [转]bitcoin API reference (JSON-RPC)
  18. python六十三课——高阶函数之sorted
  19. MT【8】和e有关的一个极限
  20. itchat key

热门文章

  1. InetAddress 类简介
  2. 21.运行Consent Page
  3. 2. docker 容器的管理(创建、查看、启动、终止、删除)
  4. 手动配置webpack之React
  5. uoj#278. 【UTR #2】题目排列顺序(拓扑排序)
  6. java 同时安装多版本问题(转)
  7. JavaWeb之用户数据回显
  8. C# 操作 Excel 文件(.xls 或 .xlsx)
  9. js 中止程序继续进行(break continue return throw)
  10. MySQL库相关操作