首页 > 其他 > 详细

C如何使用内存

时间:2014-02-28 11:23:30      阅读:487      评论:0      收藏:0      [点我收藏+]
栈:
 
自动变量:auto。变量的地址在栈中。
 
C语言函数调用的实现:
  • 在调用方,参数从后往前按顺序被堆积在栈中
  • 和函数调用关联的返回信息(返回地址等)也被堆积在栈中。
  • 一旦函数调用结束,局部变量占用的内存区域就被释放,并使用返回信息返回到原来的地址。
  • 从栈中出去调用方的参数。
测试程序:
bubuko.com,布布扣
 
结论:
  1. 地址值越大,表明越在栈底部。
  2. 参数从后往前堆积,所以看到b的地址(0033F950)大于a的地址(0033F94C)
  3. 局部变量数组也是从后往前堆积,下标越大,地址越大,越在底部。注意,局部变量(auto)的内存区域是在函数被调用时,也就是执行时被分配的。
 
C语言的可变长参数的实现,就是基于函数参数从后往前堆积。
  • printf("%d,%s\n",100,str);
printf函数支持无限长度的参数。先将参数从后往前向栈中堆积,在最上面的就是第一个参数,也就是"%d,%s\n"。然后才是函数的返回信息、局部变量等等。通过解析第一个参数,就可以知道后面有几个参数。
 
编写自己的带有可变长参数列表的函数:用 ... 代替可变长参数列表
bubuko.com,布布扣
 
动态内存分配
 
利用malloc()进行动态内存分配
malloc()不是系统调用,它是一个库函数。本质上它调用了系统调用brk()
  • 系统调用:请求操作系统来帮我们去做一些特殊的函数群
系统调用brk()就是通过设定堆下面一片很大的内存空间的末尾地址来伸缩内存空间。
bubuko.com,布布扣
函数调用时,栈会向地址较小的一方伸展。多次调用malloc时,会调用一次brk(),内存区域会向地址较大的一方伸展。
 
free()释放内存:
  • 一般来说调用free()之后,对应的内存是不会立刻返回给操作系统的。
  • 只有随着某次malloc调用,恰好把这篇区域重新分配后才会发生这一部分内容的改写
  • 但是C标准不保证情况总是这样,因此,调用free()之后,是不能引用对于的内存区域的。
临时变量和返回值
 
临时变量是不可见的,只要程序产生了一个非堆上对象而没有命名它,这便是诞生了一个临时变量,比如函数调用时的参数类型转换,以及函数返回对象的时候

C如何使用内存,布布扣,bubuko.com

C如何使用内存

原文:http://www.cnblogs.com/amghost/p/3572152.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!