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
相关推荐
DeviceHub1 小时前
硬件工程师选型笔记:ALPS SKPMAPE010 与 Tonevee TS-3025 贴片轻触开关 PIN TO PIN 评估指南
笔记
疯狂打码的少年2 小时前
【数据结构】二叉树的性质(五大性质+计算)
数据结构·笔记·算法
Capricorn19883 小时前
知芽研究问题看板无法推进?从孵化区到笔记的机制排查指南
大数据·论文阅读·人工智能·笔记·学习方法·论文笔记
闪闪发亮的小星星3 小时前
相机脱靶量VS精跟踪精度
笔记
皖山文武4 小时前
逻辑代数基础学习笔记--概述
笔记·学习·机器学习
demodeom7 小时前
Win11 + RTX 5080 本地 Coding 模型测试笔记(已弃坑)
笔记
青山是哪个青山8 小时前
LangChain 学习笔记(五):Tools 工具调用
笔记·学习·langchain
peijiping8 小时前
Agent 工具执行:并行(parallel_tool_calls)和后台(run_in_background)到底有什么区别? (学习笔记)
笔记·学习·ai agent·claude code
Oll Correct8 小时前
Adobe illustrator 案例四:吃豆人 (Pac-Man)图标绘制
笔记·ui·adobe·illustrator
LuminousCPP8 小时前
单链表专题(四)-刷题复盘篇-LeetCode 138 随机链表复制|原地拷贝法突破复杂指针操作
数据结构·笔记·算法·leetcode·链表