c語言 作用域、存儲期、鏈接屬性匯總
1、作用域
塊作用域:用{}闊起來的,從聲明開始到“}” 結束
函數作用域:goto(標識符) 的作用域為整個函數。
函數原型作用域:函數聲明開始,函數聲明結束而結束
文件作用域:整個文件或者程序
2、鏈接
無鏈接:即只在其作用域內可見
內鏈接:即在從聲明到文件結束都是可見的
外鏈接 :多個文件或者整個程序都可見
3、存儲期
靜態存儲期:在整個程序都是占有內存的
線程存儲期:thread_local,其聲明後會給每個線程分配一個單獨的私有備份
自動存儲期:局部變量通常都自動為auto 存儲期
動態存儲期:就是用new 或者malloc分配的內存,如果不主動釋放,在整個程序都占有內存
4、總結
存儲類別 存儲期 作用域 鏈接屬性 表示
自動 自動 塊 無鏈接 塊內聲明變量
寄存器 自動 塊 無鏈接 塊內使用register修飾
靜態外鏈接 靜態 文件 外鏈接 所有函數外
靜態內鏈接 靜態 文件 內鏈接 所有函數外,用static修飾
靜態無鏈接 靜態 塊 無鏈接 塊內,使用static修飾
線程存儲 自動 線程 無鏈接 thread_local修飾
4、函數的存儲期
外部函數:默認都是外部函數
靜態函數:使用static 修飾,內連接
內聯函數:inline
5、註意
- auto 在c中表示自動存儲期
- 但是auto在c++11 中表示自動推斷類型
- register 聲明後,並不一定會存到寄存器中,他只是一種請求。及時不存在寄存器中也不能對其取地址。同時可以存為register的類型可不多,
因為有些類型太大了,寄存器存不下。
- 靜態變量或者全局常量,都存儲在靜態區,在程序載入時已經執行賦值了 ,他們如果不被初始化,將會被初始化為0,存在bss段中。
6、申請內存
malloc:malloc(sizeof(xxx))
calloc:calloc(num,sizeof(xx))
realloc: realloc(p,size)
7、限定符
volatile
const:
restrict:
c語言 作用域、存儲期、鏈接屬性匯總