存儲類、鏈接和內存管理

作用域

作用域描述了程序中可以訪問一個標識符的一個或多個區域

  • 塊作用域
    • 一對花括號括起來的區域,定義在塊中的變量有塊作用域
    • 函數的形式參數也屬於塊作用域
    • 局部變量具有塊作用域
  • 函數作用域
    • 僅限於goto語句
    • 即使一個標籤首次出現在函數的內層塊中,它的作用域也延伸至整個函數
  • 函數原型作用域
    從形參定義到原型聲明結束
  • 文件作用域
    • 變量定義在函數外面,具有文件作用域
    • 從它定義的位置開始,到文件結束
    • 也稱爲全局變量

鏈接

具有文件作用域的變量可能有外部或者內部鏈接

  • 外部鏈接
    可以在一個多文件程序的任何地方使用
  • 內部鏈接
    只能在一個翻譯單元(一個源代碼文件和它所包含的頭文件)中使用
    需要注意定義與頭文件包含的順序問題,需要先定義後包含,頭文件才能使用相應的變量
    內部鏈接不能用extern聲明
  • 空鏈接
    代碼塊作用域、函數作用域、函數原型作用域的變量有空鏈接
    意味着它們是由其定義所在的代碼塊或者函數原型私有的

存儲時期

  • 靜態存儲期
    程序執行期間一直存在
  • 線程存儲期
    從被聲明到線程結束一直存在
  • 自動存儲期
    塊作用域的變量通常具有自動存儲期
    進入塊時分配空間,退出時釋放空間
  • 動態分配存儲期

自動變量

自動存儲期,塊作用域,無鏈接
關鍵字:auto
如果編寫兼容c++的程序,最好不要用auto關鍵字

寄存器變量

塊作用域,無鏈接,自動存儲期
關鍵字:register
請求成功則獲得寄存器變量
失敗則獲得存儲在內層的普通變量

函數的存儲類別

外部函數

默認是外部函數
可以被其它文件訪問

靜態函數

只能用於所定義的文件

內聯函數

定義在頭文件中,可以重複包含

malloc

void *malloc(size_t size);
傳入要分配的字節數,返回分配的地址,失敗返回NULL

calloc

void *calloc(size_t n, size_t size);
分配N個 大小爲SIZE的空間,並且全部初始化爲0

free

釋放分配的空間,否則造成內存泄漏

ANSI 類型限定符

const

定義普通變量時,該變量不能被改變
定義指針時,在*左側,則指向的值不能被改變
*右側,則指向不能被改變

volatile

通常用於硬件地址,以及在其它程序或同時運行的線程中共享數據

restrict

允許編譯器優化某部分的代碼以更好的支持計算
它只能用於指針,表明該指針是訪問數據對象的唯一方式

_Atomic

當一個線程對一個原子類型的對象執行原子操作時,其他線程不能訪問該對象

冪等

C99爲類型限定符增加了冪等性,可以在一條聲明中多次使用同一個限定符,多餘的限定符將會被忽略

const const const const int a=10;
const int a = 10;
以上是等價的
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章