C语言的5个内存段你了解吗?( 代码段/数据段/栈/堆)

news/2024/6/18 5:44:34 标签: c语言, 算法, 数据库

前言:这些内存段在程序运行时起着不同的作用,有不同的分配方式和存储内容。对于 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 语言中扮演着重要的角色,了解它们的特性和用途有助于程序员更好地理解内存管理和程序执行过程中的内存分配情况。


http://www.niftyadmin.cn/n/5198824.html

相关文章

【小呆的力学笔记】有限元专题之循环对称结构有限元原理

文章目录 1. 循环对称问题的提出2. 循环对称条件2.1 节点位移的循环对称关系2.2 节点内力的循环对称关系 3. 在平衡方程中引入循环对称条件 1. 循环对称问题的提出 许多工程结构都是其中某一扇面的n次周向重复,也就是是周期循环对称结构。如果弹性体的几何形状、约…

C++:拷贝构造函数,深拷贝,浅拷贝

一.什么是拷贝构造函数? 同一个类的对象在内存中有完全相同的结构,如果作为一个整体进行复制(拷贝)是完全可行的。这个拷贝过程只需要拷贝数据成员,而函数成员是共用的(只有一份拷贝)。在建立对…

【洛谷 P3743】kotori的设备 题解(二分答案+递归)

kotori的设备 题目背景 kotori 有 n n n 个可同时使用的设备。 题目描述 第 i i i 个设备每秒消耗 a i a_i ai​ 个单位能量。能量的使用是连续的,也就是说能量不是某时刻突然消耗的,而是匀速消耗。也就是说,对于任意实数,…

美国DDoS服务器:如何保护你的网站免遭攻击?

​  在当今数字化时代,互联网已经成为人们生活中不可或缺的一部分。随着互联网的普及和发展,网络安全问题也日益严重。其中,DDoS攻击是目前最常见和具有破坏性的网络攻击之一。那么,如何保护你的网站免遭DDoS攻击呢?下面将介绍…

Modbus转Profinet网关在污水处理系统中连接PLC和变频器Modbus通信案例

污水处理系统中使用Modbus转Profinet网关可以连接PLC和变频器,实现二者之间的通信。该网关的作用是将PLC与变频器之间的Modbus协议转换为Profinet协议,使两者可以相互沟通。在污水处理系统中,PLC控制污水处理的各个过程,而变频器则…

​软考-高级-系统架构设计师教程(清华第2版)【第14章 云原生架构设计理论与实践(P496~526)-思维导图】​

软考-高级-系统架构设计师教程(清华第2版)【第14章 云原生架构设计理论与实践(P496~526)-思维导图】 课本里章节里所有蓝色字体的思维导图

算法leetcode|89. 格雷编码(rust重拳出击)

文章目录 89. 格雷编码:样例 1:样例 2:提示: 分析:题解:rust:go:c:python:java: 89. 格雷编码: n 位格雷码序列 是一个由 2n 个整数组…

提取图像文本的 5 大 Python 库

引言 光学字符识别是一个古老但依然具有挑战性的问题,涉及从非结构化数据中(包括图像和PDF文档)检测和识别文本。它在银行、电子商务和社交媒体内容管理等领域具有广泛的应用。 但与数据科学中的每个主题一样,尝试学习如何解决OC…