栈:

 
自动变量: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. python 遍历删除日志

    #! /usr/bin/python2.6#-*- encoding:UTF-8 -*- import osimport os.pathimport time root_dir = os.getcwd ...

  2. 实时监控mysql数据库变化

    对于二次开发来说,很大一部分就找找文件和找数据库的变化情况 对于数据库变化.还没有发现比较好用的监控数据库变化监控软件. 今天,我就给大家介绍一个如何使用mysql自带的功能监控数据库变化 1.打开数 ...

  3. CentOS6 下安装JDK7

    1.下载JDK:http://www.oracle.com/technetwork/java/javase/archive-139210.html,选择Java SE 7,下载jdk-7u80-lin ...

  4. Oracle主键自增的实现

    create sequence seq_字段名_表名 minvalue 1 maxvalue 999999999999999999999999999 start with 1 increment by ...

  5. position:sticky用法

    用户的屏幕越来越大,而页面太宽的话会不宜阅读,所以绝大部分网站的主体宽度和之前相比没有太大的变化,于是浏览器中就有越来越多的空白区域,所以你可能注意到很多网站开始在滚动的时候让一部分内容保持可见,比如 ...

  6. js 解决原型问题的方案 : 构造器和原型的组合

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  7. ref和out的使用与区别

    out的使用 ————————————————————————————————————————————————— class Program    {        static void Main( ...

  8. How a non-windowed component can receive messages from Windows -- AllocateHWnd

    http://www.delphidabbler.com/articles?article=1 Why do it? Sometimes we need a non-windowed componen ...

  9. How To: Perl TCP / UDP Socket Programming using IO::Socket::INET

    http://www.thegeekstuff.com/2010/07/perl-tcp-udp-socket-programming/ In this article, let us discuss ...

  10. Codeforces Round #313 (Div. 1) A. Gerald's Hexagon 数学题

    A. Gerald's Hexagon Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/559/p ...