C语言内存分配(栈、堆、段)
1、栈:保存局部变量、函数形参、自动变量(一般未加 static
的局部变量都是自动变量)
- 特点:先进后出、空间由系统管理
- 栈区生命周期在函数调用结束后释放
- 栈区保存的局部变量未初始化时,默认初始化为随机值
2、堆由 malloc
等函数分配的空间在堆区(先进先出,由用户管理)
3、段
.bss
:保存未初始化的全局变量、系统默认是 0.data
:保存已初始化的非零全局变量和static
声明的变量.text段
保存程序执行代码(函数体)(只读)。也有可能包含一些只读的常数变量,例如字符串常量等
注意
- C语言中使用
char *p = "linux"
定义字符串时,字符串"linux"
实际被分配在代码段,也就是说这个"linux"
字符串实际上是一个常量字符串而不是变量字符串 const
型常量:C语言中const
关键字用来定义常量,常量就是不能被改变的量
const的实现方法至少有2种:
-
第一种就是编译将
const
修饰的变量放在代码段去以实现不能修改(普遍见于各种单片机的编译器) -
第二种就是由编译器来检查以确保
const
型的常量不会被修改,实际上const
型的常量还是和普通变量一样放在数据段的(gcc中就是这样实现的)