存储类别、链接和内存管理

  C变量作用域:块作用域、函数作用域、函数原型作用域、文件作用域。

  C变量的3种链接属性:外部链接、内部链接、无链接。前三种作用域变量都是无链接(仅在作用域内被使用);文件作用域变量根据定义形式来看,如果是static则为内部链接(仅在本文件内被使用),否则为外部链接(能被多个文件共享)。

  存储期:静态存储期(文件作用域变量,存在于整个程序的执行时间内)

      线程存储期(用于并发程序设计,从被声明到线程结束)

      自动存储期(块作用域变量,从进入块到块结束;VLA变长数组略有不同,是从被声明到块结束)

  综合作用域、链接属性和存储期,可以得到C为变量定义的各种存储方案:

5种存储类别
存储类别  存储期 链接属性 作用域 声明方式
自动 自动 块内,auto(缺省)
寄存器 自动 块内,register
静态内部链接 静态 内部 文件 所有函数外,static
静态外部链接 静态 外部 文件 所有函数外
静态无链接  静态 块内,static

  1、自动变量

    不会自己初始化。

  2、寄存器变量

    存储在CPU寄存器中,无法被访问地址。register的声明只是作为一种请求,即被声明的变量不一定就能存储在CPU寄存器中,因为前提需要CPU寄存器有空间来存放它。

  3、静态无链接变量

    具有块作用域,无链接,但是静态存储期使得它在块结束后不会消失,下一次进入块(例如多次的函数调用或者循环结构)时它保留有上次的值。

    未被显式初始化静态变量时,它们会被预置值为0。

  4、静态外部链接变量

    在所有函数外部声明。但本文件内函数中使用时可以用extern表明所使用的时文件作用域变量,也可不用extern;但当一个源代码文件使用的外部变量定义在另一个源代码文件中时,必须使用extern。

    未被初始化时缺省为0。

  5、静态内部链接变量

    在所有函数外声明,使用static。在本文件内部函数使用该变量时可用extern表明使用的是文件作用域变量,也可不用。静态内部变量不能再被其他文件使用。

    未被初始化时缺省为0。

  翻译单元:一个源代码文件及其头文件内容组成了一个翻译单元。

  当程序有多个翻译单元构成时,内部链接和外部链接的区别才体现出来。

  

  malloc和free函数必须配套使用,防止内存泄漏。

  静态数据(包括字符串字面量)、自动数据、动态分配内存的数据分别在内存中占不同的区域。

  

原文地址:https://www.cnblogs.com/lsh99k/p/9739671.html

时间: 2025-01-17 15:35:20

存储类别、链接和内存管理的相关文章

CPrimer Plus第12章 存储类、链接和内存管理随笔

被static修饰的属于内部链接,不可被外部程序文件所使用一般而言,全局变量(文件作用域变量)具有静态存储期,局部变量(代码块作用域变量)具有自动存储期寄存器变量不能使用地址运算符因为被static修饰的变量不会中途被释放,所以不能用static修饰函数的形参变量的定义放在所有函数定义的外部即创建了一个外部变量,若外部变量在其他文件中定义,则需见extern修饰全局变量只能用常量表达式来赋值:int i;    int j = 2*i;不被允许 ptd = (double *)malloc(n

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

注:此文为<C Primer Plus>一书中的部分总结,写下来方便以后参考. 用于存储程序数据的内存可用存储时期.作用域和链接来表征. 存储时期可以使静态的.自动的或者分配的.①如果是静态的,内存在程序开始执行时被分配,并行程序运行时一直存在.②如果是自动的,变量所用内存在程序执行到该变量定义所在代码块时开始分配,在退出代码块时释放.③如果是分配的内存,内存通过调用malloc()(或其他相关函数)分配,通过调用函数free()释放. 作用域决定哪一部分程序可以访问某个数据.在所有函数之外定

C Primer Plus (第五版) 第十二章 存储类、链接和内存管理 编程练习

第十二章 存储类.链接和内存管理 编程练习 1.Q不使用全局变量,重写程序清单13.4 #include <stdio.h>; int critic(int u); int main(void) { int units; printf("How many pounds to a firkin of butter?\n"); scanf_s("%d", &units); while (units != 56) critic(units); prin

C存储类、链接和内存管理——存储类

存储类 @[toc] C为变量提供了5种不同的存储类型: 自动 寄存器 具有代码块作用域的静态 具有外部链接的静态 具有内部链接的静态 不同角度描述变量: 存储时期 变量在内存中保留的时间 变量作用域(Scope)以及它的链接(Linkage) 变量的作用域和链接一起表明程序的哪些部分可以通过变量名来访问该变量 不同的存储类提供了变量的作用域.链接以及存储时期的不同组合. 作用域 作用域分为: 代码块作用域(block scope) 代码块在C中指的是一对花括号之间.定义在代码块之间的变量其可见

【CPP.Chap12】存储类、链接和内存管理——渣渣的艰苦学习

今晚看完这一章啦!为加入工作室奋战!!!=( ̄ˇ ̄)v C为变量提供了五种存储模型/存储类,对于一个变量,可以按照存储时期.作用域以及链接来描述它. 一.( σ'ω')σ关于作用域.链接.存储时期: 作用域(scope):分为①代码块作用域(block scope)②函数原型作用域 (function prototype scope)③文件作用域(file scope):指在所有函数之外定义的变量④*函数作用域(function scope):只适用于goto语句,暂不涉及. 链接(linkag

C存储类、链接和内存管理--动态分配内存及类型限定词

目录 存储类说明符 存储类和函数 动态分配内存 malloc函数 free函数 calloc函数 动态分配内存的缺点 C类型限定关键字 constant定义全局常量 volatile关键字 restrict关键字 @ 存储类说明符 C中存储类说明符共有5个,为auto register static extern typeddef,最后一个关键字typedef与内存存储无关. 规定:不可以在一个声明中使用一个以上存储类说明符. 存储类说明符用来确定变量的存储类型. 存储类和函数 函数的存储类有两

存储类、链接、内存管理

作用域:代码块作用域.函数原型作用域.文件作用域 函数作用域(只适用于goto) 链接:外部链接.内部链接.空链接(代码块作用域.函数原型作用域) 存储时期:静态存储时期.自动动态存储时期 五种存储类:自动,寄存器(代码块内使用register,不能使用地址运算符),外部链接的静态.内部链接的静态(static).空链接 x =30;while(x++<33){ int x = 100; printf("%d",x); } 打印了三次100,递增必须在条件判断语句中 对函数参量不

C 基础 - 存储类、链接与内存管理

存储种类 C语言提供几种存储方法,来存放在内存中的值. 基本概念: 作用域, 链接, 存储周期 五种存储类型: automatic register static with external linkage static with interanl linkage static with no linkage 分配内存 malloc() 与 free()

C Primer Plus之存储类、链接和内存管理

存储时期即生存周期——变量在内存中保留的时间 变量的作用域和链接一起表明程序的哪些部分可以通过变量名来使用该变量. 注意:生存期和作用域是两个不同的概念. 作用域    作用域描述了程序中可以访问一个标识符的一个或多个区域.一个C变量的作用域可以是代码块作用域.函数原型作用域,或者文件作用域. 在代码块中定义的变量具有代码块作用域,从该变量被定义的地方到包含该定义的代码块的末尾该变量均可见.其次,函数的形式参量尽管在函数的开始花括号前进行定义,同样也具有代码块作用域,隶属于包含函数体的代码块.