栈:

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

C如何使用内存的更多相关文章

  1. 故障重现(内存篇2),JAVA内存不足导致频繁回收和swap引起的性能问题

    背景起因: 记起以前的另一次也是关于内存的调优分享下   有个系统平时运行非常稳定运行(没经历过大并发考验),然而在一次活动后,人数并发一上来后,系统开始卡. 我按经验开始调优,在每个关键步骤的加入如 ...

  2. In-Memory:在内存中创建临时表和表变量

    在Disk-Base数据库中,由于临时表和表变量的数据存储在tempdb中,如果系统频繁地创建和更新临时表和表变量,大量的IO操作集中在tempdb中,tempdb很可能成为系统性能的瓶颈.在SQL ...

  3. In-Memory:内存优化表的事务处理

    内存优化表(Memory-Optimized Table,简称MOT)使用乐观策略(optimistic approach)实现事务的并发控制,在读取MOT时,使用多行版本化(Multi-Row ve ...

  4. 试试SQLSERVER2014的内存优化表

    试试SQLSERVER2014的内存优化表 SQL Server 2014中的内存引擎(代号为Hekaton)将OLTP提升到了新的高度. 现在,存储引擎已整合进当前的数据库管理系统,而使用先进内存技 ...

  5. 故障重现, JAVA进程内存不够时突然挂掉模拟

    背景,服务器上的一个JAVA服务进程突然挂掉,查看产生了崩溃日志,如下: # Set larger code cache with -XX:ReservedCodeCacheSize= # This ...

  6. 死磕内存篇 --- JAVA进程和linux内存间的大小关系

    运行个JAVA 用sleep去hold住 package org.hjb.test; public class TestOnly { public static void main(String[] ...

  7. 【知识必备】内存泄漏全解析,从此拒绝ANR,让OOM远离你的身边,跟内存泄漏say byebye

    一.写在前面 对于C++来说,内存泄漏就是new出来的对象没有delete,俗称野指针:而对于java来说,就是new出来的Object放在Heap上无法被GC回收:而这里就把我之前的一篇内存泄漏的总 ...

  8. C++内存对齐总结

    大家都知道,C++空类的内存大小为1字节,为了保证其对象拥有彼此独立的内存地址.非空类的大小与类中非静态成员变量和虚函数表的多少有关. 而值得注意的是,类中非静态成员变量的大小与编译器内存对齐的设置有 ...

  9. java: web应用中不经意的内存泄露

    前面有一篇讲解如何在spring mvc web应用中一启动就执行某些逻辑,今天无意发现如果使用不当,很容易引起内存泄露,测试代码如下: 1.定义一个类App package com.cnblogs. ...

  10. 查看w3wp进程占用的内存及.NET内存泄露,死锁分析

    一 基础知识 在分析之前,先上一张图: 从上面可以看到,这个w3wp进程占用了376M内存,启动了54个线程. 在使用windbg查看之前,看到的进程含有 *32 字样,意思是在64位机器上已32位方 ...

随机推荐

  1. P67、H67、H61、P55、H57、H55 区别

    Intel平台上我们现在已经有了LGA775.LGA1366.LGA1156三种封装接口,SNB还会带来两种,包括今天要看到的LGA1155(取代LGA1156),以及明年下半年的高端LGA2011, ...

  2. 再看Core Data中PSC陷入死锁的问题

    在<Core Data Programming Guide>文档的Concurrency with Core Data这一章节中提到了“Use Thread Confinement to ...

  3. Linux下安装protobuf并实现简单的客户端服务器端通信

    http://code.google.com/p/protobuf/downloads/list上可以下载Protobuf的源代码. 安装步骤如下所示: 1>tar -xzf protobuf- ...

  4. HDU 1241 Oil Deposits DFS(深度优先搜索) 和 BFS(广度优先搜索)

    Oil Deposits Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total ...

  5. 项目视频讲解_[HeyJava][尚学堂][CMS文章内容管理系统]

    [HeyJava][尚学堂][CMS文章内容管理系统] http://pan.baidu.com/s/1c0imHrE

  6. Gartner:Hype Cycle for Emerging Technologies-2013

      The “Hype Cycle for Emerging Technologies” report is the longest-running annual Hype Cycle, provid ...

  7. 去除移动端 a标签 点击有一个 阴影效果

    outline: none;appearance:none;  -webkit-tap-highlight-color: transparent;   

  8. STM32的TAMPER-RTC管脚作为Tamper使用 - 防拆机

    当 TAMPER引脚上的信号从 0变成1或者从 1变成 0(取决于备份控制寄存器BKP_CR的 TPAL位),会产生一个侵入检测事件.侵入检测事件将所有数据备份寄存器内容清除.  然而为了避免丢失侵入 ...

  9. Java常见排序算法之归并排序

    在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let ...

  10. Android多线程研究(1)——线程基础及源代码剖析

    从今天起我们来看一下Android中的多线程的知识,Android入门easy,可是要完毕一个完好的产品却不easy,让我们从线程開始一步步深入Android内部. 一.线程基础回想 package ...