因为对内存管理部分一直没有很清楚的思路,所以一直在找资料想系统看一下这部分的内容。在C primer plus里看到了这一章,虽然大多都是心知肚明的东西,但是还是很多概念性系统性的东西让我眼前一亮,把笔记整理到这里来,用于自己回顾。
作用域:
- l 代码块作用域:在代码块中(花括号包含)定义的变量,函数的形参也具有代码块作用域
- l 函数原型作用域:函数原型中使用的变量名
- l 文件作用域(全局变量):在所有函数之外(包括main函数)定义的变量具有文件作用域。
链接:
- l 外部链接:具有外部链接的变量可以在一个多文件程序的任何地方使用
- l 内部链接:(static)具有内部链接的变量可以在一个文件的任何地方使用
- l 空链接:代码块作用域或者函数原型作用域的变量有空链接
存储时期
- l 静态存储时期:具有文件作用域的变量具有静态存储时期(文件作用域变量static只表示链接类型而非存储时期)。一个具有静态存储时期的变量在程序执行期间将一直存在
- l 自动存储时期:代码块作用域的变量具有动态存储时期。程序进入代码块为这些变量分配内存,退出代码块这些内存自动释放。
存储类:
- l 自动变量:就是代码块内的变量,代码块作用域空链接自动存储时期
- l 寄存器变量:使用关键字register之后的代码块内代码可以被存在CPU寄存器中或者在速度最快的可用内存中,可以比普通变量更快的被访问
- l 具有代码块作用域的静态变量:在代码块内用static声明变量,该变量具有代码块作用域与空链接,但是在函数调用结束并不消失。到下一次调用计算机还是记录着它的值。函数参数不能用static
void staticTest() {
int p = ;
static int q = ;
cout << p++ << " " << q++ << endl;
} int main(){
staticTest();
staticTest();
staticTest(); return ;
}
输出:1,1
1,2
1,3
可见p每次都是1,而q的值则被记录下来了。
- l 具有外部链接的静态变量:全局变量,在别的文件中extern之后可用。声明数组时不必指明数组大小。如果不显式初始化,会被自动赋值0.
- l 具有内部链接的静态变量:staitic全局变量
存储类和函数:函数也具有存储类
- l 外部的(default):可被其他文件中的函数调用
- l 静态的:只可以在定义它的文件中使用
- l (C99增加了第三种:内联函数)
内存分配:malloc()和free()
- l malloc():接受一个所需内存字节数的参数,返回一个指向分配内存第一个字节地址的指针(void*)。
- e.g, double *ptd = (double*)malloc(30*sizeof(double));
- 因为返回通用指针,故而需要为返回值类型指派适当类型.如果找不到所需空间返回空指针
- l free():接受一个指针作为参数释放malloc的内存 e.g. free(ptd);
突然明白为什么自动变量存储在堆栈中呢,因为代码块内的变量在执行该代码块的时候才进入内存而在结束时又出来,符合先进后出后进先出的规律。