本周总结
2020/12/11
存储类别、链接和内存管理
存储类别
- 作用域
- 链接
- 存储器
- 自动变量
- 寄存器变量
- 静态变量
- 外部变量
(1).作用域描述程序中可访问标识符的区域。一个c的作用域可以是块作用域。块是用一对花括号括起来的代码区域。
(2).声明变量在内层块中的变量,其作用域仅局限于该声明所在的块。
外部链接变量可在多文件程序中使用,内部链接变量只能在一个翻译单元中使用。
(1).如果对象具有静态存储期,那么它在程序的执行期间一直存在。文件作用域变量具有静态存储期。
(2).块作用域的变量通常都具有自动存储期。当程序进入定义这些变量的块,为这些变量分配内存;当退出这个块时,释放当时的内存。
(3).我们目前为止使用的局部变量都是自动类别。
(4).全局变量都采用静态存储方式。
(1). 自动变量属于自动存储期、块作用域且无链接。
(2).c语言规定,未明确声明存储类别的局部变量,均视为自动变量。
(3).程序进入该变量声明所在的块时变量存在,程序在退出该块时变量消失。
(4).自动变量不会初始化。
寄存器变量不在内存中,不能取地址运算。
静态变量是指该变量在内存原地不动
唯一的一次初始化
int fact(int n){
staic int f =10;
f=f*n;
return (f);
}
第一次n=2 f=10 f=20。第二次n=3 f=20 f=60。
int fact(int n){
int f =10;
f=f*n;
return (f);
}
第一次n=2 f=10 f=20。第二次n=3 f=10 f=30
外部链接的静态变量具有文件作用域、外部链接和静态存储期。
可以在函数中用关键字可以在extern再次声明。再次声明数组时不用指出数组大小。
外部变量会被自动初始化为0.这一原则也适用于外部定义的数组。
分配内存:malloc()和free()
- malloc()
- free()
- 变长数组和动态内存分配
malloc()分配内存内存,但不会为其赋名。他会找到合适的空闲内存块,这样的内存是匿名的。
可以把该地址赋给一个指针变量,并使用指针访问这块内存。因为char表示1字节,malloc()的返回类型通常被定义为指向char的指针。
double * ptd;
ptd = (double *) malloc (30 * sizeof(double));
以上代码为30个double类型的值请求内存空间,并设置ptd指向该位置。注意:指针被声明为指向一个double类型,而不是指向内含30个类型值得块。
静态内存的数量在编译时是固定的,在程序运行期间也不会改变。自动变量使用的内存数量在程序运行期间自动增加或减少。但动态分配的内存数量只会增加,除非用free()释放。
变长数组即支持数组在定义是以一个变量来声明长度。
int i,n;
scanf("%d",&n);
int a[n];