C 语言内存布局17 Mar 2025 | 4 分钟阅读 当我们创建一个 C 程序并运行它时,它的可执行文件会以一种有组织的方式存储在计算机的 RAM 中。 C 程序的内存布局如下图所示 ![]() 从上图我们可以观察到,C 程序在程序中包含以下几个部分
让我们逐一了解每个部分。 1. 文本段文本段也称为代码段。当我们编译任何程序时,它会创建一个像 a.out、.exe 等的可执行文件,该文件存储在 RAM 内存的文本或代码段中。如果我们将在硬盘上存储指令,那么从硬盘访问指令的速度会变慢,因为硬盘工作在串行通信模式,所以从硬盘获取数据会变慢,而 RAM 直接连接到数据总线和地址总线,因此从 RAM 访问数据速度更快。 2. 数据段我们在程序中使用的数据将存储在数据段中。由于在 main() 函数内部声明的变量存储在堆栈中,但在 main() 方法外部声明的变量将存储在数据段中。在数据段中声明的变量可以以已初始化、未初始化、局部或全局的形式存储。因此,数据段分为四类,即已初始化、未初始化、全局或局部。 让我们通过一个例子来理解这种情况。 在上面的代码中,var1 和 var2 变量在 main() 函数外部声明,其中 var1 是未初始化变量,而 var2 是已初始化变量。这些变量可以在程序中的任何位置访问,因为这些变量不是堆栈中 main() 的一部分。 数据段包含两个段
未初始化数据段 未初始化数据段也称为 **.bss** 段,它存储所有未初始化的全局、局部和外部变量。如果全局、静态和外部变量未被初始化,它们默认会被赋予零值。 .bss 段代表 **Block Started by symbol (符号开始的块)**。bss 段包含存储所有静态分配变量的目标文件。这里的静态分配对象是指那些没有显式初始化的对象,它们会被初始化为零值。在上面的代码中,var1 是一个未初始化变量,因此它存储在未初始化数据段中。 让我们看一些未初始化数据段的例子。 已初始化数据段 已初始化数据段也称为数据段。数据段是程序的虚拟地址空间,它包含所有由程序员显式初始化的全局和静态变量。 数据段中的变量值不是只读的,也就是说,它们可以在运行时修改。此数据段可以进一步分为几类:
例如:像 **char str[] = "javatpoint"** 和 **int a=45** 这样的全局变量将存储在已初始化的读写区域。如果我们创建全局变量,如 const char* string = "javatpoint";,则字面量 "javatpoint" 将存储在已初始化的只读区域,而 char 指针变量将存储在已初始化的写入区域。 3. 堆栈当我们定义一个函数并调用该函数时,我们会使用堆栈帧。在函数内部声明的变量存储在堆栈中。函数参数也存储在函数中,因为参数也是函数的一部分。这种类型的内存分配称为静态内存分配,因为所有变量都在函数中定义,并且变量的大小也在编译时定义。堆栈段在内存中起着非常重要的作用,因为每当调用函数时,都会创建一个新的堆栈帧。 堆栈也用于递归函数。当函数在同一个函数中反复调用自身时,会导致堆栈溢出条件,并导致程序中出现段错误。 4. 堆堆内存用于动态内存分配。堆内存从未初始化数据段的末尾开始,并向上增长到更高的地址。malloc() 和 calloc() 函数用于在堆中分配内存。堆内存可供所有共享库和动态加载的模块使用。free() 函数用于释放堆中的内存。 下一主题C 语言中的平衡括号 |
数组是同质的。整数数组可以包含负值、正值或零。我们需要重新排列数组的元素,以便所有负元素都放在一边,要么放在数组的开头,要么放在末尾。顺序...
5 分钟阅读
C 语言中的静态变量在 C 编程语言中,静态变量是一种在同一范围内跨多次函数调用保留其值的变量。与通常在每次函数调用时分配和取消分配的常规变量不同,静态变量……
阅读 6 分钟
在本主题中,我们将学习如何在 C 语言中检查平衡括号。首先,我们将了解什么是括号。括号由下面显示的方括号表示:( ) 其中,( 开括号...
阅读 3 分钟
Ctype.h/cctype> 包含用于处理 C/C++ 中字符的内置函数,就像 string.h 头文件包含用于处理 C/C++ 中字符串的内置函数一样。有两种字符:可打印字符:显示在终端上的字符称为可打印字符。控制字符:...
阅读 4 分钟
C语言中十进制转二进制程序:我们可以通过C程序将任何十进制数(基数-10(0到9))转换为二进制数(基数-2(0或1))。十进制数是基数10的数,因为它从0到9,总共有...
阅读1分钟
数组在计算机编程中很有用,因为它们为数据结构提供了基础。数组是最常见的数据类型之一,它们能够高效地存储和操作大量相关数据。C语言以其低级功能和效率而闻名,...
阅读 4 分钟
程序员经常使用伪代码,这是一种比实际编程代码更易于阅读和理解的高级语言,来传达算法和程序逻辑。C 语言是一种高级通用编程语言,通常用于创建系统软件,并且是一种常见的实现...
阅读 3 分钟
在下面的教程中,我们将创建一个 C 应用程序来制作数字秒表。键盘命中函数缩写为 `keyboardhit()`。按下某个键后,它会发送一个信号并输出一个非零整数。这里有四个循环:……
阅读 3 分钟
算法是一系列按照预定顺序执行的指令,以解决问题或完成工作。函数是一段代码,可以从程序的其他部分调用和执行。一套...
阅读 15 分钟
在本教程中,我们将编写一个程序,将给定的24小时制时间转换为12小时制时间。时间将以小时:分钟:秒的格式给出。例如-输入:20:35:20输出:8:35:20 PM输入:00:15:40输出:12:15:40 AM算法午夜...
阅读 4 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India