存储类别、链接和内存管理小结
- 用到的关键字:
extern、static、const、volatile、restricted、_Thread_local、_Atomic;
- 函数:
rand()、srand()、malloc()、calloc()、free();
存储类别
1.作用域
-
作用域描述程序中可访问标识符的区域。
-
块是一对花括号括起来的代码区域,块里面的变量具有块作用域,只内在块内访问。
-
变量定义在函数的外面具有文件作用域(file scope),从它定义处到定义所在文件的末尾均可见。
-
2.链接
- 连接分为内部链接和外部链接,外部链接变量可以在多文件程序中使用,具有文件作用域的变量可以是外部链接或内部链接;
static
关键字:表面变量的链接属性,在文件作用域变量类型前声明该关键字代表该变量具有内部链接,无则具有外部链接(在其他文件中可以访问)。- 在块内没有声明static关键字,则表明该变量没有链接,退出块后便清除了;
3.存储期
- C对象有4种存储期:静态存储期、线程存储期、自动存储期、动态分配存储期。
- 静态存储期:无论是什么链接属性,所有的文件作用域变量都具有静态存储期;
- 线程存储期:用于并发程序设计;
- 自动存储期:块作用域的变量通常具有自动存储期。当程序进入这个块时,为这些变量分配内存,退出块时释放刚才分配的内存(块作用域的变量也能具有静态存储期,只需要加上static关键字);
void more(int number)
{
int index;
static int ct = 0;
...
return 0;
}
这里变量ct
存储在静态存储期,它一直存在,但只有在作用域定义的more函数块中可以访问;
4.extern关键字
如果一个源代码文件使用外部变量定义在另一个源代码文件中,则必须使用extern在该文件中声明该变量;
extern char Coal; /*如果Coal被定义在另一个文件中*/
分配内存:malloc()和free()
这几个函数原型都在#include<stdlib.h>
中;
**malloc()**函数可以在程序运行时分配更对的内存。该函数接受一个参数:所需的内存字节数。malloc()会找到合适的空闲块,这样的内存时匿名的,可以把地址赋给一个指针变量,并且使用指针访问这块内存。malloc()函数可用于返回指向数组的指针、指向结构的指针等。
double * ptd;
pte = (double *) malloc(30 * sizeof(double));
以上代码为30个double类型的值请求内存空间,并设置pt指向该位置;
**free()**函数的参数也应该是一个指针,指向malloc分配的一块内存,作用是释放内存;必须配套使用
注意:在使用malloc()时,程序在运行过程中才能确定数组大小。如果内存分配失败,可以调用exit()函数结束程序,标准提供两个返回值:EXIT_SUCCESS
表示普通的程序结束,EXIT_FAILURE
表示程序异常终止。
//malloc()可能分配不到内存,这种情况返回NULL指针;
if(pte == NULL)
{
puts("Memory allocation failed. Goodbys.");
exit(EXIT_FAILURE);
}
free()函数应位于程序的末尾;
calloc()函数
分配内存还可以使用calloc()函数,和malloc()类似。
long * newmen;
newmen = (long *)calloc(100,sizeof(long));
free()也可以用来释放calloc()分配的内存;
restrict类型限定符
restrict只能用于指针,表面该指针时访问数据对象的唯一且初始的方式;
int * restrict restar = (int *) malloc(10 * sizeof(int));