1. 程式人生 > >c語言 作用域、存儲期、鏈接屬性匯總

c語言 作用域、存儲期、鏈接屬性匯總

初始 執行 不存在 分配 標識符 num 賦值 inline bss

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語言 作用域、存儲期、鏈接屬性匯總