C语言的5个内存段你了解吗?( 代码段/数据段/栈/堆)
前言:这些内存段在程序运行时起着不同的作用,有不同的分配方式和存储内容。对于 C 语言程序员来说,了解这些内存段的特性和用途有助于更好地理解内存管理、变量的存储位置以及程序执行过程中的内存分配情况
1. 代码段 (Code Segment)
- 内容:代码段,也称为文本段,是包含频繁执行代码的内存区域。
- 特点:代码段通常是只读的,以避免被缓冲区溢出等编程错误覆盖的风险。
- 不包含:该代码段不包含局部变量(在C语言中也称为自动变量)、全局变量等程序变量。
- 字符串字面量:基于C实现,代码段也可以包含只读字符串。例如,当你执行printf("Hello, world")时,字符串"Hello, world"会在代码/文本段中创建。你可以在Linux 中使用size命令验证这一点。
进一步阅读:代码段
2. 数据段 (Data Segment)
数据段被分成以下两部分,通常位于堆区域的下方,或者在某些实现中位于栈的上方,但数据段永远不会位于堆和栈区域之间
a. 未初始化数据段 (BSS 段)
- 内容:包含未初始化的全局变量(包括指针变量)、未初始化的常量全局变量、未初始化的局部静态变量。
- 存储位置:任何未初始化的全局或静态局部变量都将存储在未初始化的数据段中。
- 例子:全局变量如
int globalVar;
或静态局部变量如static int localStatic;
会存储在未初始化数据段中。- 注意:如果你声明一个全局变量并将其初始化为0或NULL,那么它仍然会进入未初始化的数据段或bss。
- 进一步阅读:了解更多关于未初始化数据段的信息:未初始化的数据段
b. 初始化数据段
- 内容:包含初始化的全局变量(包括指针变量)、初始化的常量全局变量、初始化的局部静态变量。
- 例子:全局变量如
int globalVar = 1;
或静态局部变量如static int localStatic = 1;
会存储在初始化数据段中。- 细分:这个段可以进一步分为初始化只读区和初始化读写区,初始化全局常量变量放在初始化只读区,而可以在运行时修改值的变量放在初始化读写区。
- 大小:这个段的大小由程序源代码中值的大小决定,并且在运行时不会改变。
- 进一步阅读:初始化数据段
3. 栈段 (Stack Segment)
- 内容:用于存储函数内部创建的变量,如函数的局部变量(包括指针变量)、函数参数、返回地址等。
- 特点:函数执行结束后,存储在栈中的变量将被删除。
- 进一步阅读:栈段
4. 堆段 (Heap Segment)
- 内容:这个段是为了支持动态内存分配。如果程序员想动态分配一些内存,那么在C语言中,可以使用malloc,calloc或realloc方法来完成。
- 例子:例如,当
int* ptr = malloc(sizeof(int) * 2)
时,会在堆上分配8字节内存,并将分配的内存地址返回并存储在ptr
变量中。- 存储位置:取决于声明/使用方式,指针变量
ptr
可能位于栈或数据段上。
这些内存段在 C 语言中扮演着重要的角色,了解它们的特性和用途有助于程序员更好地理解内存管理和程序执行过程中的内存分配情况。