程序中内存从哪里来
在一个c语言程序中,能够获取内存的三种情况:栈(stack)、堆(heap)、数据区(.data)。
栈:
运行时自动分配&自动回收
反复使用:栈内存在程序中其实就是一块空间,程序反复使用这块空间。
脏内存
临时性
栈会溢出
堆:
OS堆管理器管理
大块内存
程序手动申请&释放
脏内存
临时性:堆内存只在malloc和free之间属于此进程,而可以访问,在malloc之前和free之后都不能再访问,否则会有不可预料的后果。
malloc(4) gcc中的malloc默认最小是以16B为分配的单位的。如果malloc小于16B的大小都会返回一个16字节大小的内存,malloc实现时没有实现任意自己分配,而是允许一些大小的块内存的分配。
数据区:
编译器在编译程序的时候,将程序中的所有元素分成了一些组成部分,各个部分构成了一个段,所以说段是可执行程序的组成部分。
代码段:代码段就是程序中的可执行部分,直观理解代码段就是函数堆叠组成的。
数据段(也被称为数据区、静态数据区、静态区):数据段就是程序中的数据,直观理解就是c语言程序中的全局变量。(注意:全局变量才算是程序的数据,局部变量不算程序的数据,只能算是函数的数据)
bss段(又叫ZI(zero initial)段):bss段的特点就是被初始化为0,bss段本质上就是属于数据段,bss段就是被初始化位0的数据段。
注意区分:数据段和bss段的区别和联系;二者本来没有本质区别,都是用来存放c程序中的全局变量的。区别在于把显示初始化位非零的全局变量存在.data段中,而把显式初始化位0或者并未显式初始化(C语言规定未显式初始化的全局变量默认为0)的全局变量存在bss段。
有哪些特殊的数据会被放到代码段
char *p = "linux";
// 定义字符串时,字符串"linux"实际被分配在代码段,也就是说这个"linux"字符串实际上是一个常量字符串而不是变量字符串。
const型常量:
c语言中const关键字用来定义常量,常量就是不能被改变的量。
const的实现方法至少有2种:
第一种就是编译将const修饰的变量放在代码段去以实现不能修改(普遍见于各种单片机的编译器)