C语言中内存布局内存模型是怎样的
目录
C语言中内存布局(内存模型)是怎样的?
本文将以图示解释C语言中的内存模型,并同时举出例子方便理解
C 语言中的 内存模型 指的是程序在运行时如何组织和管理内存。下面是一个 C 语言内存布局 的示意图:
解释:
命令行参数和环境变量:在程序启动时由操作系统传递,位于栈的上方。
栈:用于存储局部变量、函数参数、返回地址,增长方向是从高地址向低地址。
堆:用于动态内存分配(如
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