程序中获取内存的方法
内存分配:栈,堆,数据段
一.栈内存:
反复使用:栈内存在程序中其实就是那一块空间,程序反复使用这一块空间。
临时性:函数不能返回函数局部变量的地址,因为函数执行完返回后这个局部变量已经不在了
这个局部变量是分配在栈上的,虽然不在了但是栈内存还在还可以访问,但是访问实际上这个内存地址已经和当时那个变量无关了。
二.堆内存:
操作系统堆管理器管理;堆管理器是操作系统的一个模块,堆管理内存分配灵活,按需分配
malloc之后,free之前,malloc返回的指针和内存相绑定,该指针是那段内存在当前进程的唯一联系人
如果指针在free之前就弄丢了,那么这段内存就永远丢了。
free告诉堆管理器这段内存我用完了你可以回收了。堆管理器回收了这段内存后这段内存当前进程就不该再使用了。因为释放后堆管理器就可能把这段内存再次分配给别的进程,所以你不能再用了。
三.代码段、数据段、bss段
3.1.1
编译器在编译程序的时候,将程序中的所有的元素分成了一些组成部分,各部分构成一个段,所以说段是可执行程序的组成部分。
3.1.2
代码段:代码段就是程序中的可执行部分,直观理解代码段就是函数堆叠组成的。
数据段(数据区,静态数据区):数据段就是程序中的数据,直观理解就是c语言中的全局变量
(注意:全局变量才算是程序的数据,局部变量不算程序的数据,只能算是函数的数据)
bss段(ZT(zero initial)):bss段的特点就是被初始化为0,bss段本质上也属于数据段,bss段就是被初始化为0的数据段。
注意区分:数据段和bss段的区别和联系:二者本来没有区别,都是用来存放C程序中的全局变量。区别在于把显示初始化为非零的全局变量存在数据段中,而把显式初始化为0或者并未显式初始化(C语言规定未显示初始化的全局变量值默认为0)的全局变量存在bss段
注意:
有些特殊数据会被放到常量区
3.1.3
C语言中使用char *p = “linux”;
定义字符串时,字符串”linux”实际被分配在常量区(老朱说是代码段),也就是说这个”linux”是常量字符串而不是变量字符串。