1. 程式人生 > >C語言變數的儲存型別

C語言變數的儲存型別

變數的儲存型別

“這些都是用來修飾變數的,修飾函式的時候,其可能有不同的含義,請加以區分,後面會針對修飾函式來進行總結”

儲存型別 變數 說明
auto 自動變數 區域性變數在預設的情況下會歸為自動變數,預設是不會進行初始化,會產生隨機值
static 靜態變數 在程式執行的時候存在,並且只要整個程式在執行,就可以繼續訪問該變數,預設是會進行初始化,並且只有一次
extern 外部變數(全域性變數) 作用領域是整個程式,包括該程式的各個檔案,生存週期非常長,它在該程式執行結束後,才開始釋放記憶體,預設是會初始化並且初始化一次
register 暫存器變數 存放在Cpu的暫存器當中,對於迴圈次數較多的迴圈控制變數以及迴圈體內部反覆使用的變數可定義為及存取變數,只能是區域性變數不能是全域性變數,並且不能加static進行修飾,預設是不會進行初始化的

區分:
auto對區域性變數的時候預設會歸類為自動變數,預設是不會進行初始化的,
static 生命週期是整個程式。預設是會初始化的
extern 如果為全域性變數,預設是預設歸類為全域性變數,預設會初始化的
register暫存器變數,不一定會申請成功。

如果想要深入的瞭解其中的原理的話,那我們必須首先來理解一下Linux下,記憶體管理部分的原理:

auto區域性變數儲存的地方是棧——–>不會初始化,棧的呼叫是迴圈利用的,有可能其中儲存的是以前儲存型別的資料。
而static和extern所儲存的區域為資料段——–>會初始化
register不能定義成全域性和靜態的時候,說明他們儲存的位置是不允許放入靜態儲存區域中的,生命週期僅僅侷限在函式內部

如下圖所示:Linux的記憶體分配:
這裡寫圖片描述

下面我們來通過一個事例來看一下這寫變數的儲存型別:

#include<stdio.h>
#include<stdlib.h>

int global_variable_num;//全域性變數,初始化為0,生命週期為軟體執行週期
static int static_global_variable_num;//靜態全域性變數,初始化為0,生命週期軟體執行 int *gloable_pointer;//全域性指標變數,初始化為NULL, void func(); int main(void){ printf("global_variable_num:%d\n",global_variable_num); printf("static_global_variable_num:%d\n",static_global_variable_num); printf("*gloable_pointer:%p\n",gloable_pointer); global_variable_num++; static_global_variable_num++; /**呼叫三次func函式,系統會每次都會為函式分配一次函式棧空間,第一次執行完之後,棧空間會被釋放,然後第二次執行的時候,系統會再次分配,而第二>次分配的空間與第一次的不一定屬於一個空間。以此類推*/ func(); func(); func(); return 0; } void func(){ int patical_variable;//區域性變數,預設是不會初始化的,系統會自動將其歸類為自動變數 auto int auto_patical_variable;//區域性自動變數,不會初始化 static static_patical_variable;//靜態區域性變數。系統會初始化一次,並且其生命週期是整個軟體的週期,儲存在資料段中的靜態儲存區域 printf("global_variable_num:%d,static_global_variable_num:%d\n",global_variable_num,static_global_variable_num); printf("patical_variable:%d,auto_patical_variable:%d,static_global_variable_num:%d\n",patical_variable,auto_patical_variable,static_global_variable_num); register int register_variable = 10;//暫存器變數。暫存器變數,暫存器變數生命週期屬於函式內部。 register_variable++; printf("register_variable:%d\n",register_variable); static_global_variable_num++; printf("static_global_variable_num:%d\n",static_global_variable_num); }

輸出結果為 :
global_variable_num:0
static_global_variable_num:0
*gloable_pointer:(nil)
global_variable_num:1,static_global_variable_num:1
patical_variable:158690944,auto_patical_variable:32671,static_global_variable_num:1
register_variable:11
static_global_variable_num:2
global_variable_num:1,static_global_variable_num:2
patical_variable:158690944,auto_patical_variable:32671,static_global_variable_num:2
register_variable:11
static_global_variable_num:3
global_variable_num:1,static_global_variable_num:3
patical_variable:158690944,auto_patical_variable:32671,static_global_variable_num:3
register_variable:11
static_global_variable_num:4

以上結果可以看出來整個變數儲存型別的分配和作用域,具體結果分析不在贅述,在程式碼塊中已經詳細進行講解,謝謝