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. 设置Windows 8.1屏幕自己主动旋转代码, Auto-rotate function code

    程序代码实现启用或禁用Windows 8.1 Tablet的自己主动旋转功能 方法一:使用SetDisplayAutoRotationPreferences函数功能 #include <Wind ...

  2. [cocos2dx笔记008]cocos2d 用luabridge手动绑定类

    基于cocos2dx 2.2.2版本号.这几天使用了cocostudio实现了,动画.骨骼动画.UI编辑.粒子效果,尽管有些不足,但已经算是很好了.今天尝试用lua.这个很easy.创建的时候.设置语 ...

  3. HTML5_表单元素

    <!DOCTYPE html> <hmtl> <html  lang="zh-cn"> <head> <meta charse ...

  4. android imageButton 透明图片

    在Android有许多不规则button.例如: 这个时候,我们假设想做成不规则button的话.第一步就是搞一张边缘透明的png图片,然后用src指定到他.这个时候我们会发现,还没有达到要的效果.还 ...

  5. 编译hibernate源代码

    1)安装gradle,gradle是一个类似maven的构建工具 2)安装gitclient. 从网址 https://github.com/hibernate/hibernate-orm 上clon ...

  6. hdu 1429 胜利大逃亡(延续)(BFS+比特压缩)

    #include <stdio.h> #include <string.h> #include <iostream> #include <algorithm& ...

  7. Android新建项目后src下没有自动生成文件

    最近开始学Android了,按照教材新建了一个项目,发现src下没有自动生成文件,怎么回事呢? 出现这种可能的原因很可能是ADT与SDK版本不同,造成不兼容. 在ADT(或者eclipse)中的hel ...

  8. 阿里2015回顾面试招收学历(获得成功offer)

    1. 引言 继上次"百度2015校园招聘面试题回顾录(成功拿到offer)"文章过后,大家都希望除了题目之外.最好能给出自己当时的回答情况,看看有没有什么回答技巧,这样更有參考价值 ...

  9. iOS 面试题:OC标题的基本概念&lt;延续&gt;

    第一,如何确定一个方法方法名称 删除减号,加,删除返回值,删除参数类型,删除参数,剩下的就是的方法名 秒,id,能够用assign,copy,retain,依据须要使用 第三,autorelease ...

  10. oracle 解锁scott账户

    安装oracle数据库的时候忘了解锁账户,再加上一直配置不成功,链接不上,最后终于配置好了,发现没账户可用,oracle好难. oracle版本是 Oracle Database 11g Enterp ...