目录

C语言中内存布局内存模型是怎样的

目录

C语言中内存布局(内存模型)是怎样的?

本文将以图示解释C语言中的内存模型,并同时举出例子方便理解

C 语言中的 内存模型 指的是程序在运行时如何组织和管理内存。下面是一个 C 语言内存布局 的示意图:

https://i-blog.csdnimg.cn/direct/4a0e3c1d3908499f981f03116c39fbe7.png

解释:

命令行参数和环境变量:在程序启动时由操作系统传递,位于栈的上方。

栈:用于存储局部变量、函数参数、返回地址,增长方向是从高地址向低地址。

堆:用于动态内存分配(如 malloc ),增长方向是从低地址向高地址。

数据段

.data (已初始化数据):已初始化的全局变量和静态变量。

.bss (未初始化数据):未初始化的全局变量和静态变量,默认初始化为 0。

代码段:存放可执行的程序代码,通常是只读的。

示例代码:

#include <stdio.h>
#include <stdlib.h>

int global_var = 10;        // 已初始化的全局变量(数据段 .data)
static int static_var = 20; // 已初始化的静态变量(数据段 .data)
int uninit_global_var;      // 未初始化的全局变量(数据段 .bss)
static int uninit_static_var; // 未初始化的静态变量(数据段 .bss)

void func() {
    int stack_var = 30;  // 局部变量(栈区)
    printf("栈区局部变量地址: %p\n", (void*)&stack_var);
}

int main() {
    int local_var = 40; // 局部变量(栈区)
    char *heap_var = (char *)malloc(50 * sizeof(char)); // 动态分配内存(堆区)

    printf("栈区 - 局部变量地址: %p\n", (void*)&local_var);
    printf("堆区 - 动态分配内存地址: %p\n", (void*)heap_var);
    printf("BSS段 (.bss) - 未初始化的静态变量地址: %p\n", (void*)&uninit_static_var);
    printf("BSS段 (.bss) - 未初始化的全局变量地址: %p\n", (void*)&uninit_global_var);
    printf("数据段 (.data) - 已初始化的静态变量地址: %p\n", (void*)&static_var);
    printf("数据段 (.data) - 已初始化的全局变量地址: %p\n", (void*)&global_var);
    printf("代码段(函数地址): %p\n", (void*)&func);
    

    free(heap_var); // 释放动态分配的内存

    return 0;
}

运行结果:

通过比较地址大小,我们可以很直观地看到内存布局高地址到低地址的情况。


栈区 - 局部变量地址: 0x7ffc89f76b34
堆区 - 动态分配内存地址: 0x55b3c5ea7260
数据段 (.data) - 已初始化的静态变量地址: 0x55b3c5e83008
数据段 (.data) - 已初始化的全局变量地址: 0x55b3c5e83004
BSS段 (.bss) - 未初始化的静态变量地址: 0x55b3c5e83010
BSS段 (.bss) - 未初始化的全局变量地址: 0x55b3c5e8300c
代码段(函数地址): 0x55b3c5c7f699