c语言-存储类&周期&作用域&链接属性

存储类、生命周期、作用域、链接属性息息相关,所以要放在一起来理解。

什么是存储类?

一个c程序中的变量和函数等等的存放都有自己特定的地方,分为BSS段数据段代码段

我们定义的局部变量就是存放在栈上的,栈是一种FILO数据结构,栈内存的使用不需要程序员手动配置,由系统自动分配和释放。

当我们需要大块内存时,例如我们定义了一个结构体,结构体中有很多元素,这时我们就不要使用栈了,因为栈的数量较少,我们可以使用malloc来申请一块大块内存,这块内存就被分配到了堆上,然后就可以使用了,当使用完毕在使用free释放内存。

数据段

当我们定义一个显示初始化为非0的全局变量或静态局部变量时,系统在加载程序时,就会把这种类型的变量放到数据段上。BSS段和数据段的本质是一样的,只是存放的变量的初值不同。

BSS段

当我们定义一个未初始化或显示初始化为0的全局变量或静态局部变量时,系统在加载程序时,就会把这种类型的变量放到BSS段上。BSS段和数据段的本质是一样的,只是存放的变量的初值不同。

代码段和只读数据段

代码段由程序的代码组成,如果我们定义一个(const修饰的变量)那么这个变量就可能会被放到代码段或只读数据段中,程序运行时,程序自身时不能修改代码段和只读数据段中的数据的。

什么是生命周期?

一个变量从诞生到消亡的周期。
一个变量的生命周期取决于其所被存放的位置。

局部变量

局部变量被存放在栈上,所以它的生命周期就是从他的定义所在的这个函数的调用开始到这个函数的结束。
静态局部变量是被存放在BSS段/数据段上的,所以他的生命周期是从这个程序的执行到程序的结束。

全局变量

全局变量是被存放在BSS段/数据段的,所以他的生命周期是从这个程序的执行到程序的结束。
静态全局变量也是如此。

函数和放在代码段/只读数据段的数据

因为他们都是程序的构成,所以生命周期是永久的。

什么是链接属性?

链接属性是指代码编译后生成.o文件需要被链接成可执行文件时的属性。
代码在被编译生成二进制.o文件时,如果引用其他文件中的函数/全局变量,我们不加以声明,是不能通过编译的,无法生成.o文件。
链接属性有三种 无链接、外链接、内链接。

无链接

局部变量和静态局部变量的链接属性就是无链接,因为局部变量的作用域仅在代码块之间,根本不用考虑是否会被其他文件引用。

外链接

全局变量和函数就是外链接,他们可以被其他文件所使用。

内链接

在一个工程中有数个文件时,我们不能保证他们之间会不会用重名的函数/局部变量,如果出现多个同名函数/变量,在链接时就会产生错误,所以我们要用static关键字把全局变量和函数修饰为静态的,这就是让他们只能在定义他们的文件中使用,把他们隐藏起来,防止出现错误。
静态变量/静态函数是内链接的。

什么是作用域?

变量的作用域指的是能使用该变量的区域

局部变量

局部变量的作用域是局部的,仅在定义它的代码块之中。
静态局部变量的作用域是局部的,仅在定义它的代码块之中。

全局变量

全局变量的作用域是文件作用域,可以跨文件使用,可以作用于整个工程中的所有文件。
静态全局变量的作用域仅在他所定义的文件,不能跨文件使用,因为它的链接属性是内链接。

函数

函数的作用域是文件作用域,所以它可以被其他文件所应用。
静态函数的作用域是定义他的文件,因为它的链接属性是内链接。

作用域冲突怎么办?

例如我们定义了一个全局变量a,又定义了局部变量a,作用域产生重叠时,作用域大的那个变量会被隐藏,只有作用域小的那个变量会起作用。

存储类的关键字

auto

其实我们的局部变量默认就是被auto修饰,自动的,让系统自动把它放到栈上。

static

static的作用主要有两种:
修饰局部变量,让局部变量的存放到数据段/bss段,其生命周期也会变成程序的开始到程序的结束。
修饰全局变量或函数,让他们的链接属性变成内链接,仅在其定义所在的文件起作用,不会影响其他文件。

register

register关键字修饰的变量一般是需要高频读写的变量,所以用这个关键字修饰,把它放到寄存器中,让读写效率提高,但是不能保证修饰了就能放到寄存器中,只能是尽量。

volatile

volatile的中文意思是易变得,多变的,变量一个变量如果会被硬件、进程、中断修改,就用volatile修饰他,不让编译器对其优化,防止产生莫名其妙的错误。

extern

extern关键字用于声明全局变量,如果我们要使用其他文件中定义的全局变量,首先要在我们的文件中用,extern声明它,编译才能通过,以后才能使用,

restrict

restrict关键字只能用于修饰指针,告诉编译器这个指针指向的内容只能通过这个指针来修改,让编译器放心的去优化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值