当前位置:网站首页>【C】从内存出发理解C语言变量作用域与生命周期
【C】从内存出发理解C语言变量作用域与生命周期
2022-07-22 10:24:00 【NjustMEMS_ZJ】
目录
1 内存分区
C源代码进过预处理、编译、汇编和链接4步生成一个可执行程序。
程序在没有运行之前,也就是说程序没有被加载到内存前,可执行程序内部已经分好3段信息,分别是代码区(text)、数据区(data)和未初始化数据区(bss)三个部分。(部分人直接把data和bss合起来叫做静态区或全局区)。
运行可执行程序,系统把程序加载到内存,除了根据可执行程序的信息分出代码区、数据区和未初始化数据区之外,还额外增加了栈区和堆区,如下图所示。
1.1 代码区
代码区存放CPU执行的机器指令。通常代码区是可共享的(即另外的执行程序可以调用它),因为对于频繁被执行的程序,只需要在内存中有一份代码即可。代码区通常是只读的,为了防止程序意外地修改了它的指令。
1.2 已初始化全局变量/静态变量/常量(data区)
该区包含了在程序中明确被初始化的全局变量、已经初始化的静态变量(包括全局静态变量和局部静态变量)和常量数据(如字符串常量)。
1.3 未初始化全局变量/静态变量(bss区)
存入的是全局未初始化变量和未初始化静态变量。未初始化数据区的数据在程序开始执行之前被内核初始化为0或者空(NULL)。
1.4 栈区(stack)
栈是一种先进后出的内存结构,由编译器自动分配释放,存放函数的参数值、返回值、局部变量等。在程序运行中实时加载和释放,因此,局部变量的生存周期为申请到释放该段栈空间。不同的操作系统分配给每一个程序的栈区大小不同:一般Windows是1M ~ 8M不等,一般Linux是1M ~ 16M不等。
1.5 堆区(heap)
堆是一个大容器,它的容量远大于栈,用于动态内存分配,堆在内存中位于BSS区和栈区之间。一般由程序员分配和释放,若不主动释放,程序结束时,由操作系统回收。堆区通常加载音频文件、视频文件、图像文件、文本文件以及大小超过栈大小由程序员主动申请分配的内存的大数组等。
2 代码演示
下面代码能更好的帮你理解上面所说的内容。
#include <stdio.h>
int global_init_var = 3;
int global_var;
static int statci_global_init_var = 4;
static int statci_global_var;
int main(void)
{
int local_init_var = 3;
static int static_local_init_var = 3;
const int local_const = 3;
char *p_char = "Hello world";
char CharArry[] = "Hello world";
printf("global_init_var :%p \n",&global_init_var);
printf("statci_global_init_var :%p \n",&statci_global_init_var);
printf("\n");
printf("global_var :%p \n",&global_var);
printf("statci_global_var :%p \n",&statci_global_var);
printf("p_char :%p \n",p_char);
printf("\n");
printf("local_init_var :%p \n",&local_init_var);
printf("static_local_init_var :%p \n",&static_local_init_var);
printf("local_const :%p \n",&local_const);
printf("CharArry :%p \n",&CharArry);
printf("\n");
return 0;
}
运行结果如下
3 生命周期
- 程序在加载到内存前,代码区和全局区(data和bss)的大小就是固定的,程序运行期间不能改变。
- data段和bss区中的数据的生存周期为整个程序运行过程。
- data段、text区和bss区是由编译器在编译时分配的,堆和栈是由系统在运行时分配的。
- 堆和栈在函数使用完之后便释放或由操作系统进行过回收
边栏推荐
猜你喜欢
Simple implementation process of CNN
Simple use of JVM's JPS
Xcode11 add lanuchimage black screen can't display problem
【读书笔记】《MySQL体系结构和存储引擎》
When the appsstore transporter uploads, it is stuck in the process of verifying the problem
Spark loads CSV and JSON files (attached to the virtual machine to execute the jar package)
Kotlin learning 1: variables, functions, conditional statements and loop statements
Flutter 2 Advanced (I): practical skills of flutter
Creation of sparksql dataset
Youboxun helps Shenzhen build a global "city of Hongmeng Oula"
随机推荐
NC27 集合的所有子集(一)
Precautions for pouring swift code into OC project
Fixed left width, adaptive right width
Xcode11 添加lanuchimage黑屏无法显示问题
shell 脚本编写提示
蓝桥杯——进制转换练习
为什么memset不能将数组元素初始化为1?
Flutter开发(三十一):Flutter启动白屏
Pregel function in spark graphx (Reprint)
*Flutter problem record
图的深度优先搜索和广度优先搜索
Spark RDD depends on the working principle of DAG
location.replace和location.href区别
Fluent 2 Advanced (IV): Based on navigator 2.0 packaging
Privacy policy of bird platform
登录页面的代码
Shutter 2 Advanced (II): shutter air safety
Kotlin学习三:集合与Lambda
Spark SQL: MySQL classic 50 questions (SQL version and spark version)
Fluent 2 Advanced (V):json_ Serializable use