首页 未命名正文

linux编程_C语言之从内存角度明白差别类型的变量

云返利网 未命名 2020-05-26 09:06:20 13 0

我们都知道在C语言中差别类型的变量在内存中的存放位置差别的,从内存角度上讲,差别内存块中存放的代码或者变量其属性(主要是作用域、生命周期、链接属性)是差别的。

首先我们先容一下作用域、生命周期已经链接属性的观点

1:作用域

作用域也就是指变量其作用的局限

(1)局部变量为代码块作用域(也就是说局部变量的作用局限是{  })

(2)函数和全局变量是文件作用域,进一步讲其作用局限就是函数和全局变量界说或者声明后的部门。

2:生命周期

生命周期也就是变量的发生时间和消亡时间

(1)栈变量的生命周期:局部变量是被分配到栈上面的(栈变量),其生命周期是暂且的,暂且的意思是按需要去建立、使用、消亡。好比在一个子函数内里界说了一个局部变量int a;那么当这个子函数被挪用执行的时刻,局部变量int a;会被建立在栈上面(符号a和栈上面的某个内存相绑定),当这个子函数被挪用竣事时,局部变量int a就消亡了(作废符号a和栈上面的某个内存的绑定),很现实的一个例子就是,当我们写个程序去读取局部变量的地址时,每次读取的地址值是纷歧样的。

(2)堆变量的生命周期

首先需要明了一点,堆内存空间是客观存在的,它是由系统维护的一段内存空间,程序员只是向系统申请堆内存,然后释放,以是堆变量也是有生命周期的,其生命周期就是mallloc(返回申请堆内存的首地址)申请到free释放,

(3)数据段、bss段的生命周期

全局变量的生命周期是永远的,永远的意思是从被界说最先,一直到程序竣事。

(4)代码段、只读段的生命周期

代码段存放的是程序执行的代码(也就是函数),它的生命周期是永远的,然则一样平常不去研究代码的生命周期,需要注重的是放在代码段的另有const修饰的常量和字符常量(const类型的常量、字符串常量有时刻放在rodata段,有时刻放在代码段,取决于平台)

3:链接属性

链接属性是指代码在链接时的属性,包罗外毗邻、内链接、无链接三种

(1)外毗邻:意思是外部链接属性,也就是说可以在整个程序局限(可以跨文件)内举行链接

(2)内链接:意思是内部链接属性,也就是说可以在当前c文件局限内举行链接

(3)无链接:意思是这个符号自己不介入链接,所有的局部变量(auto的,static的)都是无链接的

注重这里还涉及一个同名变量屏障规则的问题

(1)问题:编程时,不可避免会泛起同名变量。变量同名后纷歧定会失足。

(2)首先,若是两个同名变量作用域差别且没有交叠,这种情况下同名没有任何影响。好比两个子函数内里都界说了局部变量int a;

(3)其次,若是两个同名变量作用域有交叠,C语言规定在作用域交叠局限内,

作用域小的一个变量会遮掩掉作用域大的谁人(就小局限原则)。好比界说了一个全局变量int a;又在子函数界说了局部变量int a;那么在这个子函数内里起作用的就是局部变量int a;

接下来从变量的类型角度出发,剖析代码这三打要素详细到差别变量中的意义

1:通俗局部变量

作用域为代码块作用域,生命周期为暂且性生命周期,链接属性为无链接

通俗局部变量被分配到栈上面,是按需建立、使用、消亡的,栈每次分配给变量是的地址是不确定的(随机分配)这就决议了其链接属性是无链接。

2:静态局部变量(static修饰的局部变量)

静态局部变量被分配到了数据段或者bss段(显示初始化为非0则被分配到数据段,未显式初始化或者显式初始化为0则被分配到bss段),作用域为代码块作用域,生命周期为永远性生命周期,链接属性为无链接(由于它的作用域是代码块作用域)。由于静态局部变量被分配到了数据段或者bss段,以是它的生命周期是永远的,所分配的地址和静态局部变量的符号的绑定是稳定的,直到程序竣事,以是在一个程序中多次使用统一个静态局部变量时实在操作的是统一段内存,由于有这一特征,以是静态局部变量常用来统计子函数被挪用的次数。

3:全局变量和通俗函数

作用域为文件作用域,生命周期为永远,链接属性为外毗邻

【关于云返利网】

云返利网是阿里云、腾讯云、华为云产品推广返利平台,在各个品牌云产品官网优惠活动之外,云返利网还提供返利。您可以无门槛获得阿里云、华为云、腾讯云所有产品返利,在官网下单后就可以领取,无论是自己用、公司用还是帮客户采购,您个人都可以获得返利。云返利网的目标是让返利更多、更快、更简单!详情咨询13121395187(微信同号)