news 2026/4/23 20:46:58

C内存布局

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C内存布局

一、变量作用域与存储类别

根据定义位置和存储方式,变量可分为以下几种类型:

int degree = 0; // 全局变量,文件作用域(其他文件声明后可引用) static int cnt = 0; // 静态全局变量,文件作用域(仅当前文件可访问) int main() { int times = 0; // 自动局部变量,函数作用域,动态存储 static double price = 5.0; // 静态局部变量,函数作用域,静态存储 // ... }

变量分类总结

变量类型作用域存储位置生命周期初始化
全局变量整个程序数据区程序运行期间默认0或指定值
静态全局变量当前文件数据区程序运行期间默认0或指定值
自动局部变量函数内部栈区函数执行期间未初始化,值不确定
静态局部变量函数内部数据区程序运行期间默认0或指定值(仅一次)

二、C程序内存布局详解

不同操作系统对C程序的内存布局安排略有不同,但基本结构相似。以下以Linux系统为例,详细解析进程的内存布局:

2.1 代码段(Text Segment)

  • 内容:CPU执行的机器指令和只读常量

  • 特性

    • 只读属性,防止程序意外修改指令

    • 可共享,多个进程可共享同一代码段副本

    • 大小固定,在程序加载时确定

2.2 数据段(Data Segment)

数据段分为两部分:

2.2.1 已初始化数据段
  • 存储内容

    int global_init = 100; // 已初始化全局变量 static int static_init = 200; // 已初始化静态变量 const int const_val = 300; // 常量(可能在此段或代码段)
2.2.2 BSS段(Block Started by Symbol)
  • 存储内容

    int global_uninit; // 未初始化全局变量 static int static_uninit; // 未初始化静态变量 char buffer[1024]; // 未初始化大数组
  • 特点:程序启动前由系统自动初始化为0

2.3 堆区(Heap)

// 堆内存动态分配示例 int *arr = (int*)malloc(100 * sizeof(int)); // 分配100个int空间 if (arr != NULL) { // 使用分配的内存 for (int i = 0; i < 100; i++) { arr[i] = i * 2; } free(arr); // 必须手动释放 }

堆内存管理要点

  1. 分配机制:系统维护空闲内存链表,按需分配

  2. 内存碎片:频繁分配释放可能产生碎片

  3. 性能开销:涉及系统调用和用户态/内核态切换

  4. 内存泄漏:忘记释放会导致内存泄漏

2.4 栈区(Stack)

int factorial(int n) { // 参数n在栈中 if (n <= 1) { return 1; // 返回值通过寄存器或栈传递 } int result; // 局部变量,在栈中分配 result = n * factorial(n-1); // 递归调用,每次调用创建新栈帧 return result; }

栈的特点

  • 自动管理:函数调用时分配,返回时释放

  • 后进先出:适合函数调用和返回

  • 大小有限:通常几MB,过度使用会导致栈溢出

  • 高速访问:比堆访问速度快

三、字节序:大端与小端模式

3.1 基本概念

在计算机系统中,多字节数据的存储方式分为两种:

模式特点典型系统
大端模式高位字节在低地址,低位字节在高地址PowerPC, IBM, Sun, 网络协议
小端模式低位字节在低地址,高位字节在高地址x86, DSP
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 13:02:16

Servlet 进阶!生命周期+3种创建方式+前后台传参,一篇吃透

各位小伙伴&#x1f468;&#x1f4bb;&#xff01;上一篇我们搞定了 Servlet 入门&#xff0c;今天直接进阶——聊聊 Servlet 的“一生”&#xff08;生命周期&#xff09;、3 种创建方式的优劣&#xff0c;还有前后台怎么传参。这些都是面试高频考点&#xff0c;也是实际开发…

作者头像 李华
网站建设 2026/4/23 4:47:12

中国香港股市估值:国际金融中心的市场特点

中国香港股市估值:国际金融中心的市场特点 关键词:中国香港股市、估值、国际金融中心、市场特点、投资分析 摘要:本文聚焦于中国香港股市的估值及其作为国际金融中心所呈现出的市场特点。首先介绍了研究中国香港股市估值及市场特点的目的、范围、预期读者等背景信息。接着阐述…

作者头像 李华
网站建设 2026/4/23 14:33:34

机器人关节电机散热设计

&#x1f393;作者简介&#xff1a;科技自媒体优质创作者 &#x1f310;个人主页&#xff1a;莱歌数字-CSDN博客 &#x1f48c;公众号&#xff1a;莱歌数字&#xff08;B站同名&#xff09; &#x1f4f1;个人微信&#xff1a;yanshanYH 211、985硕士&#xff0c;从业16年 从…

作者头像 李华
网站建设 2026/4/23 12:47:56

布隆过滤器:原理、特性与 Python 实现

布隆过滤器(Bloom Filter)是一种空间效率极高的概率型数据结构,由 Burton Howard Bloom 于 1970 年提出。它被广泛用于快速判断一个元素是否可能存在于一个集合中。虽然存在一定的误判率,但其在内存占用和查询速度上的优势使其在许多高性能系统中不可或缺。 核心特性 布隆…

作者头像 李华
网站建设 2026/4/23 12:52:23

Elasticsearch 索引设计详解

在使用 Elasticsearch 构建搜索或分析系统时,合理设计索引的 Settings(设置) 和 Mappings(映射) 是确保系统性能、功能和可维护性的关键。本文将通过一个贴近真实业务场景的完整示例,系统性地介绍如何配置索引,涵盖常见字段类型、分析器、多字段、嵌套结构、禁用字段等核…

作者头像 李华