C语言:存储类别、链接和内存管理

链接

C变量的三种链接:外部链接、内部链接、无链接

  • 无链接变量:具有块作用域、函数作用域或函数原型作用域的变量
  • 外部链接变量和内部链接变量:具有文件作用域
  • 外部链接变量:可以在多文件程序中使用
  • 内部链接变量:只能在一个翻译单元内使用

存储期

  • 对象:从硬件来看,被储存的的每个值都占用一定的物理内存,对象即这一块内存
  • 存储期:用于描述对象,指对象在内存中保留了多长时间
  • 标识符:用于访问对象,其作用域和链接表明了程序的哪些部分可使用它
  • 作用域:描述程序中可访问标识符的区域

C对象有四种存储期:静态存储期、线程存储期、自动存储期、动态分配存储期

  • 静态存储期所有文件作用域变量都具有静态存储期。对于文件作用域变量,关键字static表明了其链接属性而非存储期
  • 线程存储期:用于并发程序设计,程序执行可悲氛围多个线程。具有线程存储期的对象,从被声明时到线程结束一直存在。以关键 字_Thread_local声明一个对象时,每个线程都获得该变量的私有备份
    ps:变长数组的存储期从声明处到块的末尾

变量

  • 自动变量:自动存储类别的变量具有自动存储期、块作用域且无链接
  • 寄存器变量:比普通变量访问速度更快,且寄存器变量地址无法获取(存储在寄存器而非内存中)
  • 块作用域的静态变量:具有块作用域、无链接、静态存储期
  • 外部链接的静态变量:具有文件作用域、外部链接、静态存储期
    ps:将变量定义性声明放在所有函数外即可创建外部变量,在函数中可用extern再次声明。未初识外部变量时自动初始为0
  • 内部链接的静态变量:具有静态存储期、文件作用域、内部链接
    ps:随机数函数rand()使用内部链接的静态变量

分配内存函数malloc()和free()

  • malloc():分配内存,但不会为其赋名,返回动态分配内存块的字节地址。可以将改地址赋给一个指针变量,用指针变量访问这块内存。
    eg:
double * p;
p = (double *) malloc(10 * sizeof(double));
  • free():此函数的参数是之前malloc()返回的地址,释放之前malloc()分配的内存
    ps:malloc()和free()的指针变量可以不同,但是两个指针必须存储相同的地址
    ::不能释放相同的内存两次!::
  • exit():内存分配失败,调用exit()函数结束程序
  • calloc():和malloc()类似,它把块中的所有位都设置为0

相关关键字

  • _Thread_local:以关键字_Thread_local声明一个对象时,每个线程都获得该变量的私有备份。
  • auto :存储类别说明符,为了表明有意覆盖一个外部变量定义或者强调不要把该变量改为其他存储类别
    ps:::auto在C和C++中用法完全不同::
  • register:用于声明寄存器变量,但不一定申请成功,编译器根据寄存器或最快可用内存数量来决定是否响应请求。
    ps:::即使是分配内存,用register声明的变量也不可以直接访问地址::
  • static:提供静态存储期,可用于声明块作用域变量
  • extern:用于引用现有的外部定义,且可在函数中重复声明任何具有文件作用域的变量。对于数组,在引用声明的时候不用指明数 组大小
  • const:恒常性
    ps:多文件使用const时,在一个文件中定义声明,在其他文件中引用声明或者将const变量放在头文件中
const float * p;			//p可以指向别处,p指向的值不能变
float * const p;			//p不可以指向别处,p指向的值可以改变
const float * const p;	//p不可以指向别处,p指向的值不可以改变
const int arr[];			//不能改变arr中的数据
const int * arr;			//同上

restric:只能用于指针,表明该指针是访问数据对象的唯一且初始的方式

你可能感兴趣的:(程序设计语言,c语言,内存管理)