全国咨询/投诉热线:400-618-4000

c/c++培训C语言核心知识总结(七)

更新时间:2016年10月21日16时37分 来源:传智播客C++培训学院 浏览次数:

七、内存四区
 
stack: 栈区,是由编译器自动分配和释放,主要是存放函数参数的值,局部变量的值。
 
heap:堆区,是由程序员自己申请分配和释放,需要 malloc(); calloc(); realloc();函数来申请,用free()函数来释放
如果不释放,可能出现野指针。
 
**函数不能返回指向栈区的指针,但是可以返回指向堆区的指针。**
 
data:数据区 -> 静态(全局)区 和 常量区
静态(全局)区:标有 static 关键字,保存了静态变量和全局变量
1. 初始化的全局变量和初始化的静态变量,在一块区域;
(data段存放在编译阶段(而非运行时)就能确定的数据,可读可写。
也就是通常所说的静态存储区,赋了初值的全局变量和赋初值的静态变量存放在这个区域,常量也存放在这个区域;)
 
2. 未初始化的全局变量和为初始化的静态变量,在一块区域;
(BSS段通常是指用来存放程序中未初始化的全局变量和静态变量的一块内存区域。特点是可读写的,在程序执行之前BSS段会自动清0)
 
3. 静态变量的生命周期是整个源程序,而且只能被初始化一次,之后的初始化会被忽略。
(如果不初始化,数值数据将被默认初始化为 0, 字符型数据默认初始化为 NULL )。
 
常量区:这里的数据是只读的,常量和字符串都保存在这里。(不包括字符数组类型的字符串 -> 栈区)
除了第一次初始化外,常量区的数据在程序执行的时候不允许再次赋值。
 
整个数据区的数组,在程序结束后由系统统一销毁。
 
code:代码区,用于存放编译后的可执行代码,二进制码,机器码。
 
 
 
/*
BSS段:BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。
 
                 BSS是英文Block Started by Symbol的简称。BSS段属于静态内存分配。
 
 
 
数据段:数据段(data segment)通常是指用来存放程序中已初始化的全局变量的一块内存区域。
 
                 数据段属于静态内存分配。
 
 
 
代码段:代码段(code segment/text segment)通常是指用来存放程序执行代码的一块内存区域。
 
                 这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读, 某些架构也允许代码段为
 
                 可写,即允许修改程序。在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等。
 
 
 
堆(heap):堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。当
 
                           进程调用malloc等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张);当利用
 
                           free等函数释放内存时,被释放的内存从堆中被剔除(堆被缩减)
 
 
 
栈(stack):栈又称堆栈, 是用户存放程序临时创建的局部变量,也就是说我们函数括弧“{}”中定义的变量
 
                     (但不包括static声明的变量,static意味着在数据段中存放变量)。除此以外,在函数被调用时,
 
                     其参数也会被压入发起调用的进程栈中,并且待到调用结束后,函数的返回值也会被存放回栈中。
 
                     由于栈的先进先出特点,所以栈特别方便用来保存/恢复调用现场。从这个意义上讲,我们可以把
 
                     堆栈看成一个寄存、交换临时数据的内存区。
*/
 
 
 
 
static 关键字详解:
static 在C语言里面既可以修饰变量,也可以修饰函数。
 
static 变量:
1. 静态局部变量:在函数中定义的,生命周期是整个源程序,但是作用域和自动变量没区别。
都是只能在定义这个变量的函数范围内使用,而且只能在第一次进入这个函数时候被初始化,
之后的初始化会跳过,并保留原来的值。退出这个函数后,尽管这个变量还在,但是已经不能使用了。
 
2. 静态全局变量:全局变量本身就是静态存储的,但是静态全局变量和非静态全局变量又有区别:
1) 全局变量:变量的作用域是整个源程序,其他源文件也可以使用,生命周期整个源程序。
2) 静态全局变量:变量的作用域范围被限制在当前文件内,其他源文件不可使用,生命周期整个源程序。
 
static 函数(内部函数):
只能被当前文件内的其他函数调用,不能被其他文件内的函数调用,主要是区别非静态函数(外部函数)
 
总结:
作用域:变量或函数在运行时候的 有效作用范围 。
生命周期:变量或函数在运行时候的 没被销毁回收 的存活时间。
 
      作用域    生命周期
 
局部变量 所在代码块内   所在函数结束
 
全局变量 所有文件内   程序执行结束
 
静态局部变量 所在代码块内     程序执行结束
 
静态全局变量 当前文件内   程序执行结束
 
普通函数 所有文件内   程序执行结束
 
静态函数 当前文件内   程序执行结束
本文版权归传智播客C++培训学院所有,欢迎转载,转载请注明作者出处。谢谢!
作者:传智播客C/C++培训学院
首发:http://www.itcast.cn/c/