第12章 儲存類 鏈結和記憶體管理

2021-08-04 14:38:44 字數 1930 閱讀 9825

c有5種不同的儲存模型、或稱儲存類

儲存時期:變數在記憶體中保留的時間

作用域:描述了程式中可以訪問乙個識別符號的乙個或者多個區域

分類描述

作用域**塊作用域

在**塊定義的變數

函式原型作用域

從變數定義處一直到原型宣告的末尾

檔案作用域

乙個在所有函式之外定義的變數

鏈結外部鏈結

可以在乙個多檔案程式的任何地方使用

內部鏈結

可以在乙個檔案的任何地方使用

空鏈結具有**塊作用於或者函式原型作用域的變數有空連線,意味著他們是由其定義所在**塊或者函式私有。

儲存時期

靜態儲存時期

具有檔案作用域的變數,變數的位置固定不變

自動儲存時期

具有**塊作用域的變數

儲存類時期作用域

鏈結宣告方式

自動自動

**塊空

**塊內

暫存器自動

**塊空

**塊內,使用關鍵字register

具有外部鏈結的靜態

靜態檔案

外部所有函式之外

具有內部鏈結的靜態

靜態檔案

內部所有函式之外,使用關鍵字static

空連線的靜態

靜態**塊

空**塊內,使用關鍵字static

自動變數

只有變數定義所在的**塊才可以通過名字訪問該變數,程式進入包含變數的**塊時候,變數才開始存在。

最常見的儲存類,就是日常在main或者函式中的,int n;可以在前面加儲存類說明符auto來說明,例如 auto int n

暫存器變數

基本和自動變數相同,只是暫存器變數是多存放在乙個暫存器裡,而非記憶體中,所以無法獲得暫存器變數的位址。宣告乙個暫存器類變數僅僅是乙個請求,而非一條命令。

具有**塊作用域的靜態變數(空鏈結的靜態變數 )

這些變數和自動變數具有相同的作用域,但當包含這些變數的函式完成工作時,它們並不會消失。

具有外部連線的靜態變數

把變數的定義宣告放在所有函式之外,即建立了乙個外部變數

在使用換這個外部變數的函式中通過使用extern關鍵字來再次宣告他。

外部變數的作用域:從宣告的位置開始到檔案結尾為止。無static

外部變數將自動被賦初值0.

具有內部鏈結的靜態變數

把變數的定義宣告放在所有函式之外,但需要用儲存類說明符static宣告   

記憶體分配函式

函式說明

例子特性

malloc()

malloc(位元組數)

double *ptd;

ptd=(double *)malloc(30 * sizeof(double));

返回那塊記憶體第乙個位元組的位址

calloc()

calloc(單元數量,單元位元組數)

long *newmem;

newmem=(long *)calloc(100,sizeof(long));

將塊中全部為都設定為0

free()

free(指標)

free(ptd)

型別限定詞const

const int nochange;

nochange=12;

不能給nochange賦值12

const int nochange=12;

合法指標中的const

const float *pf;

pf本身的值可以改變,但指向的值不變

float * const pt;

總是指向同乙個位址,但所指向的值可以改變

const float * const ptr

總是指向同乙個位址,所指向的值不變

const const * pfc;

等價於const float *pfc;

第12章 儲存類別 鏈結和記憶體管理(未完結)

關鍵字 auto extern static register const volatile restricted thread local atomic 函式 rand srand time malloc calloc free 如何確定變數的作用域 可見的範圍 和生命期 它存在多長時間 設計更複...

儲存類,鏈結和記憶體管理

一,儲存類 不同的儲存類提供了變數的作用域,鏈結以及儲存時期的不同組合。儲存時期,作用域,鏈結 儲存時期 變數在記憶體中保留的時間。函式原型作用域從變數定義處一直到原型宣告的末尾。這說明編譯器在處理乙個函式的引數時,它所關心的只是該引數的型別。乙個在所有函式之外定義的變數具有檔案作用域。二,鏈結 關...

儲存類 鏈結和記憶體管理

作用域 鏈結乙個 變數具有下列鏈結之一 外部鏈結 內部鏈結或空鏈結。具有 塊作用域或者函式原型作用域的變數有空鏈結,意味著它們是由其定義所在的 塊或者函式原型所私有的。具有檔案作用域的變數可能有內部或者外部鏈結。乙個具有外部鏈結的變數可以在乙個多檔案程式的任何地方使用。乙個具有內部鏈結的變數可以在乙...