原文地址http://daileinote.com/computer/c_base/04
存储期:
静态存储期分配的内存在程序执行期间一直存在
线程存储期分配的内存从线程生成到线程结束之前一直存在
自动存储期对象一般在块里面,当程序进入这个块时分配内存,退出这个块时就释放内存
动态存储期手动分配内存和释放内存(malloc,calloc)
作用域:
文件作用域(全局)
块作用域可见范围在块内
函数作用域仅用于goto标签
函数原型作用域函数原型的形参定义到结束,所以定义函数原型时,形参名编译器不关心,只要类型准确就行。
链接:
外部链接就是该对象在别的文件里也能被访问到
内部链接就是该对象只能在同一个文件里才能被访问到
无链接一般在块里,只能在块里才能被访问到
我们从例子中来解释
//a.c
//具有静态存储期,文件作用域,外部链接
char *name = "沧浪水";
//具有静态存储期,文件作用域,内部链接
static char *url = "http://www.freecls.com";
//main.c
#include <stdio.h>
//由于在别的文件声明了name为静态存储期,文件作用域,外部链接
//所以我们在这里可以直接拿来用
//extern就是用来表明该变量来自外部文件
extern char *name;
//由于在别的文件声明了name为静态存储期,文件作用域,内部链接
//在这里访问不到,所以下面语句无效
//extern char *url;
//不会产生命名冲突
char *url = "http://www.baidu.com";
int main(){
//具有自动存储期、块作用域
//另一种写法 auto char ch = 'a'
char ch = 'a';
puts(name); //沧浪水
puts(url); //http://www.baidu.com
}
gcc main.c a.c
./a.out #沧浪水
存储类别和动态内存分配
静态存储类别内存在编译的时候就已经确定,该类别的变量在程序开始的时候被创建,程序结束时被销毁。
自动存储类别内存在进入块时创建,离开块时销毁,内存数量会相应的增加和减少,这部分内存通常作为栈来处理,按顺序创建,按相反的顺序销毁。
动态分配的内存在调用malloc()或相关函数时创建,在调用free()时销毁,由程序员管理,内存会相对凌乱,速度通常也会比栈内存要慢。
静态数据(包括字符串字面量)存在一个内存区域,自动数据会存放在内存另一个区域(栈),动态分配的内存会存放在第3个区域(通常称为堆或自由内存)