C语言的程序内存布局,从高到低依次为:栈区、堆区、未初始化数据区、初始化数据区、代码区。

一、栈区

由编译器自己主动管理,无需程序猿手工控制。存放函数的參数值、局部变量的值等。栈区内容从高地址到低地址分配,从低地址到高地址存取。

    int a = 0;
int b = 0;
int array[5] = {1, 2, 3, 4, 5}; printf("&a......%p\n", &a);
printf("&b......%p\n", &b);
printf("array...%p\n", array);

输出:

    &a......0x7fff5fbff944
&b......0x7fff5fbff940
array...0x7fff5fbff920

从上面的程序执行结果能够看出来。栈中的内容是先定义的变量存放在栈区的上面。后定义的变量放在以下,而空间大小是依据变量的类型决定的。

    printf("&array[0]...%p\n", &array[0]);
printf("&array[1]...%p\n", &array[1]);
printf("&array[2]...%p\n", &array[2]);
printf("&array[3]...%p\n", &array[3]);
printf("&array[4]...%p\n", &array[4]); &array[0]...0x7fff5fbff920
&array[1]...0x7fff5fbff924
&array[2]...0x7fff5fbff928
&array[3]...0x7fff5fbff92c
&array[4]...0x7fff5fbff930

从上面执行的结果中能够看出,数组中的每个元素的地址是越来越大的,比方array[0]它是数组中的第一个元素。可是地址却是最小的那个。

在上面我们还能看到一个现象,就是array数组中的最后一个元素地址与b的地址没有连接上。除去array[4]本身占用的4个字节空间与b的地址还相差12个字节,这是由于系统在分配内存时,每次会开辟全部变量中占用内存最大的那个元素所占用的内存,然后再从高到低分配。假设本次开辟的内存空间不够存放下一个变量时,会又一次开辟一个最大元素的内存空间。比方说上面的那三个变量,每次会开辟20个字节的空间(int
array[5] ==> 5 * 4),a占用了4个。b占用了4个,还剩下12个不能存放array数组。所以就又开辟了一块20个字节的内存空间。

下图是眼下我们的程序在执行时。各个数据的位置。

C语言的这些事情有关内存的更多相关文章

  1. C语言中计算变量占用内存空间

    C语言中计算变量占用内存空间 在C语言中通常用[sizeof]运算符计算变量占内存空间,如下面的例子:

  2. 【ZZ】C 语言中的指针和内存泄漏 & 编写高效的C程序与C代码优化

    C 语言中的指针和内存泄漏 http://www.ibm.com/developerworks/cn/aix/library/au-toughgame/ 本文讨论了几种在使用动态内存分配时可以避免的陷 ...

  3. C语言可以分配的最大内存

    前言 最近用C刷PAT算法题目, 发现C语言有太多需要关注大小范围的东西必须 知道, 虽说挺麻烦, 但也挺有意思. int最大值是多少 首先就是int类型的取值范围, 这个太常用. C语言标准规定最低 ...

  4. c语言类型修饰符及内存

    今天来学习一下c语言类型修饰符及内存分布 1.auto int a; 默认在内存 2.register int a; 限制变量定义在寄存器上的修饰符 编译器会尽量安排CPU的寄存器去存放这个a,如果寄 ...

  5. C语言中储存类别和内存管理

    C语言中储存类别和内存管理 储存类别 C语言提供了多种储存类别供我们使用,并且对应的有对应的内存管理策略,在了解C中的储存类型前,我们先了解一下与储存类型相关的一些概念. 1. 基础概念 对象:不同于 ...

  6. C 语言中的指针和内存泄漏

    引言对于任何使用 C 语言的人,如果问他们 C 语言的最大烦恼是什么,其中许多人可能会回答说是指针和内存泄漏.这些的确是消耗了开发人员大多数调试时间的事项.指针和内存泄漏对某些开发人员来说似乎令人畏惧 ...

  7. C语言中的指针和内存泄漏

    引言 对于任何使用C语言的人,如果问他们C语言的最大烦恼是什么,其中许多人可能会回答说是指针和内存泄漏.这些的确是消耗了开发人员大多数调试时间的事项.指针和内存泄漏对某些开发人员来说似乎令人畏惧,但是 ...

  8. 李洪强iOS开发之【零基础学习iOS开发】【02-C语言】06-变量与内存

    在前面一节中简单介绍了变量的使用,当我们定义一个变量的时候,系统就会为变量分配一块存储空间.而变量的数值在内存中是以二进制的形式存储的,这讲来深入研究变量在内存中的一些存储细节. 一.字节和地址 为了 ...

  9. 【面试题】如何让C语言自动发现泄漏的内存

    1. 题目 改造malloc和free函数,使C语言能自动发现泄漏的内存,在程序退出时打印中遗漏的内存地址和大小. 2. 思路 用一个链表来记录已经分配的内存地址.在malloc时,把分配的内存地址和 ...

随机推荐

  1. 在基于阿里云serverCentOS6.5下安装Subversion 1.6.5服务

    近期阿里云搞了个1元免费提供云server的活动,偶心痒痒就申请了一个. 正好能够作为团队的SVNserver了,以下就来部署SVN服务吧. 一.安装基础环境 apr-1.5.0.tar.gz apr ...

  2. [JSP][JSTL]页面调用函数--它${fn:}内置函数、是推断字符串是空的、更换车厢

    页面中调用函数--之${fn:}内置函数 函数描写叙述 fn:contains(string, substring) 假设參数string中包括參数substring,返回true fn:contai ...

  3. sails中文文档地址

    http://sailsdoc.swift.ren/ Sails.js是一个Web框架,可以于轻松构建自定义,企业级Node.js Apps.它在设计上类似于像Ruby on Rails的MVC架构的 ...

  4. Oracle DG故障诊断一则:alter database recover to logical standby new_logical_dbname卡住

    我们在基于物理standby的基础上搭建逻辑备库过程过程中,在运行: alter database recover to logical standby READDB; 卡住不动,而且alert也没有 ...

  5. hdu 神、上帝以及老天爷

    HDU 2006'10 ACM contest的颁奖晚会隆重开始了! 为了活跃气氛,组织者举行了一个别开生面.奖品丰厚的抽奖活动,这个活动的具体要求是这样的: 首先,所有参加晚会的人员都将一张写有自己 ...

  6. NGUI简单背包系统的实现

    一.利用txt文件存储游戏物品信息 首先在asset下创建一个txt文件,这里我们命名为objectsInfoList.txt,并将其拖放到unity Project视图中. 其中txt中我们先存放一 ...

  7. 左右db_block_size了解和实验

    关于db_block_gets了解和实验 实验 一. 自己手动创建的小表 创建一个区大小为  40k  SYS@ORCL>show parameter db_block_size NAME   ...

  8. 一个简单的RPC框架

    一个 系统模型 二.数据库代码实现 1. mkdir database cd database vim dbInit.c /* * * Database Init tool * */ #include ...

  9. atitit.(设计模式1)--—职责链(chain of responsibility)最佳实践O7 转换日期

    atitit.设计模式(1)---职责链模式(chain of responsibility)最佳实践O7 日期转换 1. 需求:::日期转换 1 2. 能够选择的模式: 表格模式,责任链模式 1 3 ...

  10. OCP-1Z0-051-名称解析-文章12称号

    12. You need to produce a report where each customer's credit limit has been incremented by $1000. I ...