`

C程序组成部分(内存布局)

 
阅读更多

一、C程序组成部分

1)正文段——CPU执行的机器指令部分;一个程序只有一个副本;只读,防止程序由于意外事故而修改自身指令;
2)初始化数据段(数据段)——在程序中所有赋了初值的全局变量,存放在这里。
3)非初始化数据段(bss段)——在程序中没有初始化的全局变量;内核将此段初始化为0。
4)栈——增长方向:自顶向下增长;自动变量以及每次函数调用时所需要保存的信息(返回地址;环境信息)。
5)堆——动态存储分,自底向上。


高地址:
0x7FFFFFFF
命令行参数和环境变量
栈空间,向下减小
...
...
...
堆空间,向上增长
未初始化的数据
已初始化的数据
正文段
低地址:
0x00000000

栈由系统自动分配,速度较快。但程序员是无法控制的。


二、static关键字
用static声明的局部变量具有静态存储持续期(static storage duration),或静态范围(static extent)。虽然他的值在函数调用之间保持有效,但是其名字的可视性仍限制在其局部域内。静态局部对象在程序执行到该对象的声明处时被首次初始化。

1. 全局静态变量
在全局变量之前加上关键字static,全局变量就被定义成为一个全局静态变量。
1)内存中的位置:静态存储区(静态存储区在整个程序运行期间都存在)
2)初始化:未经初始化的全局静态变量会被程序自动初始化为0(自动对象的值是任意的,除非他被显示初始化)
3)作用域:全局静态变量在声明他的文件之外是不可见的。准确地讲从定义之处开始到文件结尾。


定义全局静态变量的好处:
<1>不会被其他文件所访问,修改
<2>
其他文件中可以使用相同名字的变量,不会发生冲突。

2. 局部静态变量
在局部变量之前加上关键字static,局部变量就被定义成为一个局部静态变量。
1)内存中的位置:静态存储区
2)初始化:未经初始化的全局静态变量会被程序自动初始化为0(自动对象的值是任意的,除非他被显示初始化)
3)作用域:作用域仍为局部作用域,当定义它的函数或者语句块结束的时候,作用域随之结束。
注:当static用来修饰局部变量的时候,它就改变了局部变量的存储位置,从原来的栈中存放改为静态存储区。但是局部静态变量在离开作用域之后,并没有被销毁,而是仍然驻留在内存当中,直到程序结束,只不过我们不能再对他进行访问。

当static用来修饰全局变量的时候,它就改变了全局变量的作用域(在声明他的文件之外是不可见的),但是没有改变它的存放位置,还是在静态存储区中。

3. 静态函数
在函数的返回类型前加上关键字static,函数就被定义成为静态函数。
函数的定义和声明默认情况下是extern的,但静态函数只是在声明他的文件当中可见,不能被其他文件所用。

定义静态函数的好处:
<1> 其他文件中可以定义相同名字的函数,不会发生冲突
<2>
 静态函数不能被其他文件所用。


三、extern关键字
基本解释
extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。
注意:函数的定义和声明默认情况下是extern

使用extern修饰的变量在连接的时候只找寻同名的标号,不检查类型.

分享到:
评论

相关推荐

    易语言分析数据类型内存布局

    理解数据类型的内存布局对于深入学习易语言编程以及优化程序性能至关重要。 在易语言中,数据类型主要包括基本类型、复合类型和自定义类型。基本类型如整型、实型、字符型等,它们在内存中的布局通常是连续的字节...

    易语言分析数据类型内存布局源码

    - **结构体和数组**:结构体是由多个不同类型数据组成的一个复合数据类型,其内存布局取决于成员的大小和对齐规则。数组则是在内存中连续存储的相同类型元素序列。 3. **源码分析** 在提供的`content.txt`文件中...

    linux内存管理实验报告

    Linux内存管理是操作系统的核心组成部分,它负责有效地分配和回收内存资源,确保系统高效稳定地运行。在本实验中,我们主要探讨了Linux虚拟内存管理的原理、动态内存操作函数的使用,以及如何检测主存使用情况。 ...

    10Java对象的内存布局1

    在内存布局方面,每个Java对象都有一个对象头(object header),它由两部分组成:标记字段和类型指针。标记字段用于存储对象的运行时数据,如对象的哈希码、垃圾收集信息以及锁状态。类型指针则指向对象的类元数据...

    内存的使用和结构组成

    内存是计算机系统中至关重要的组成部分,它负责存储程序的运行时数据和指令。在学习Java或C语言等编程语言时,深入理解内存的使用和结构组成对于提升编程技能至关重要。本文将详细介绍内存的原理、类型以及如何在...

    RTTI内存模型布局研究

    RTTI是C++多态性的重要组成部分,特别是对于动态类型检查和类型转换非常有用。本文将深入探讨RTTI的内存模型布局,以及其在Itanium C++ ABI、Microsoft Visual C++ (MSVC)编译器中的实现细节。 首先,RTTI通常涉及...

    简单的内存查看器

    在计算机科学中,内存是计算机运行程序和存储数据的重要组成部分。内存分为物理内存(RAM)和虚拟内存(交换空间)。物理内存是直接由CPU访问的快速存储,而虚拟内存则是硬盘上的预留空间,用于扩展物理内存。当物理...

    操作系统 内存管理 java编写

    操作系统中的内存管理是确保系统高效运行的关键组成部分。内存管理主要涉及如何分配、使用和回收内存资源,以满足多个进程的需要。在这个实验中,我们关注的是可变式分区管理,这是一种动态分配内存的方法,允许根据...

    DSP实验报告—实验2 编写一个以C语言为基础的DSP程序

    - 了解C语言程序的组成部分,如函数定义、数据类型、控制结构等。 2. **连接命令文件**: - 学习编制连接命令文件,用于控制代码的连接过程,确保程序正确地映射到目标硬件资源。 - 掌握如何使用命令文件来指定...

    内存整理专家

    内存是计算机系统中至关重要的组成部分,它负责存储程序运行时的数据和指令。当计算机运行多个应用程序或者长时间工作后,内存可能会被大量占用,导致系统性能下降。这就是"内存整理专家"所关注的问题。该工具旨在...

    探讨Java的对象是怎么在内存中产生的?

    对象头是对象在内存中的重要组成部分,用于存储对象的运行时数据。对象头的结构可以细分为两部分: 1. **Mark Word**:存储对象的元数据信息,具体包括但不限于: - 哈希码 - GC分代年龄 - 锁状态标志 - 线程...

    抓取游戏内存基数 抓取游戏内存基数

    2. 挂机脚本:在了解了游戏内存布局后,可以编写挂机脚本,自动执行一些重复任务。 3. 逆向工程:对于游戏开发者而言,抓取内存基数是逆向工程的一部分,有助于理解和分析游戏的内部逻辑。 四、注意事项 1. 法律...

    内存结构图 和PE结构图

    NT头中包含了程序的入口点、文件和内存布局信息。 3. **节表**:描述了PE文件的各个部分(如.text、.data等)。 4. **导出表**:列出程序对外提供的函数和变量。 5. **导入表**:记录了程序依赖的外部函数和库。 6. ...

    BIOS内存分布详图

    BIOS内存分布是理解计算机启动过程及操作系统加载机制的重要组成部分。通过了解这些关键区域的布局,开发者可以在设计BootLoader或操作系统时更加高效地利用有限的资源,从而提高系统的稳定性和性能。此外,熟悉这些...

    【操作系统课程设计】使用C++实现模拟虚拟内存系统

    虚拟内存是现代操作系统中的核心组成部分,它为每个进程提供了独立的、连续的内存空间,即使物理内存是有限且分散的。通过虚拟内存,程序可以认为自己拥有全部的内存资源,而实际的内存管理则由操作系统负责。这种...

    内存管理方面x86,LINUX下的内存管理方式

    在IT领域,内存管理是操作系统的核心组成部分,尤其是在x86架构下的Linux系统中。内存管理不仅关乎系统的性能,还直接影响到程序的运行效率和稳定性。本文将深入探讨x86架构下Linux系统的内存管理机制。 首先,x86...

    C与汇编混编 程序的结构

    中断处理程序是嵌入式系统中的重要组成部分,它们响应外部或内部事件,中断当前任务并执行特定的服务。中断向量通常位于ROM的固定位置,包含中断服务程序的入口地址。Startup文件中的sect30.inc文件会定义中断向量表...

    内存碎片处理技术

    程序员通过编译和链接过程预先分配结构、联合体、数组等数据类型的内存,此时一般不会产生内存碎片,因为编译器可以预测数据的生命周期,从而优化内存布局。然而,在运行时使用动态内存分配函数(如C语言中的`malloc...

    DA14580内存映射和配置文件 UM-B-011_DA14580 MemoryMap and Scatter Filev1.1.pdf

    - **散列文件的基本结构** (图4) 描述了Scatter文件的一般格式和组成部分。 - **输入参数** (图5) 展示了使用Excel工具进行配置时需要设置的关键参数。 - **结果展示** (图6) 通过Excel工具的输出结果来说明如何根据...

    linux内存分析详解

    在Linux系统中,内存管理是操作系统核心的重要组成部分。本文将深入探讨Linux内核中的内存分析,包括内存映射、连续内存申请、缺页处理以及如何通过`/sys/kernel/debug/memblock`等路径来查看内存分配情况。 1. **...

Global site tag (gtag.js) - Google Analytics