Ⅰ 靜態存儲區
3個a不會沖突。
這里涉及幾個方面的知識:
1. 全局變數和靜態數據放在靜態存儲區,生命周期為從申請到程序退出。因此局部變數若定義為static,則存儲在靜態存儲區,否則存儲在函數的棧內,生命周期為本函數內。
2. 全局變數和局部變數的作用域,全局變數為從申請到整個程序結束,局部變數為從申請到本{}范圍內。
3. 局部變數對全局變數的屏蔽。若在本函數內定義的變數與全局變數同名,則將全局變數屏蔽,使用時為內部定義的局部變數。
4. 定義為static類型的局部變數,再次進入該函數,可以使用保留的結果。
下面的程序可以幫助理解:
#include<stdio.h>
int a = 1;
void fun()
{
static int a =3;
int b = 1;
printf("%d, %d\n", a, b);
a++;
b++;
}
int main()
{
printf("%d\n", a); /* global a */
static int a = 2;
printf("%d\n", a); /* static a in main */
fun(); /* static a in fun */
fun(); /* static a in fun */
return 0;
}
運行結果為:
1 /* 全局變數a */
2 /* 因為定義了main內的局部變數static int a,全局變數a被屏蔽,列印的為main局部變數a */
3, 1 /* 因為定義了fun內的局部變數static int a,全局變數a被屏蔽,列印的為fun內的局部變數a。 b是局部變數,列印為1 */
4, 1 /* 因為static的生命周期為整個程序,再次進入fun是a的值可以被保留,再次調用列印的值編程了3+1=4。b因為是在棧內,函數退出後空間被釋放,再次進入是重新申請的空間,結果仍為新初始化的值1 */
Ⅱ c語言的內存變數
存儲類別指的是數據在內存中存儲的方法。存儲方法分為靜態存儲和動態存儲兩大類。標准C語言為變數、常量和函數定義了4種存儲類型:extern、auto、static、register。根據變數的存儲類別,可以知道變數的作用域和存儲期。這4種存儲類型可分為兩種生存期限:永久的(在整個程序執行期都存在)和臨時的(暫時保存在堆棧和寄存器中)。extern和static用來標識永久生存期限的「變數和函數」,而anto和register用來標識臨時生存期限的"變數"。只有變數才有臨時生存期限。一個變數和函數只能具有一個存儲類型,也只能有一種生存期限。
內存中供用戶使用的空間有三部分:
程序區:存放程序的可執行代碼;
靜態存儲區:存放靜態變數(全局變數和靜態局部變數);
動態存儲區:存放函數調用時調用函數的現場保護和返回地址、函數形參、自動局部變數;
變數的聲明分為」定義性聲明「(需建立存儲空間,如:int a;)和」引用性聲明「(不需建立存儲空間,如extern a;)。廣義上講,聲明包括定義,一般為敘述方便,把建立存儲空間的聲明稱定義,而不不需建立存儲空間的聲明稱聲明。
auto
函數中的局部變數,如果不用關鍵字static加以聲明,編譯系統對它們是動態地分配存儲空間的。函數的形參和在函數中定義的變數(包括在復合語句中定義的變數)都屬此類。在調用該函數時,系統給形參和函數中定義的變數分配存儲空間,數據存儲在動態存儲區中。在函數調用結束時就自動釋放這些空間。如果是在復合語句中定義的變數,則在變數定義時分配存儲空間,在復合語句結束時自動釋放空間。因此這類局部變數稱為自動變數(auto variable)。自動變數用關鍵字auto作存儲類別的聲明。
對自動變數賦初值,不是在編譯時進行的,而是在函數調用時進行。對自動變數來說,若不賦初值,則它的值是一個不確定的值。
Ⅲ 常量存儲區和靜態存儲區有什麼區別 static const int a=10;是存到常量存儲區還是靜態存儲區
如樓上所說,常量存儲區裡面的數據是放在代碼段里的,不佔內存。靜態存儲區是在內存空間中的,在其所屬的類(或文件)中是全局的。
c語言中const好像沒有用處。
static const int a=10;我個人認為是存到靜態區的。你可以上網搜一下static const修飾的變數是如何賦初值的,一般有兩種方法。一是定義時直接賦初值,二是類外賦初值。而常量是無法用這兩種方法賦初值的。
Ⅳ 什麼是靜態存儲區和動態存儲區啊
1. 全局變數和靜態數據放在靜態存儲區,生命周期為從申請到程序退出。因此局部變數若定義為static,則存儲在靜態存儲區,否則存儲在函數的棧內,生命周期為本函數內。
2 動態存儲放自動變數和局部變數
Ⅳ C語言動態和靜態存儲類別的區別
主要區別在於存儲區域和作用時間。
C語言的數據區分為靜態存儲區與動態存儲區。
靜態存儲是指在程序運行期間給變數分配固定存儲空間的方式。如全局變數存放在靜態存儲區中,程序運行時分配空間,程序運行完釋放。
動態存儲是指在程序運行時根據實際需要動態分配存儲空間的方式。如形式參數存放在動態存儲區中,在函數調用時分配空間,調用完成釋放。
Ⅵ 手機取證的取證源
在手機取證的過程中 ,第一步的工作是從手機各 個相關證據源中獲取有線索價值的電子證據 。手機 的 SIM 卡、內存、外置存儲卡和移動網路運營商的業 務資料庫一同構成了手機取證中的重要證據源。
1. 1 SIM 卡
在移動通信網路中 , 手機與 SIM 卡共同構成移 動通信終端設備。 SIM ( Sub sc ribe Iden tity Mo le ) 卡 即為客戶識別模塊 ,它也被稱為用戶身份識別卡。移 動通信網路通過此卡來對用戶身份進行鑒別 ,並且同 時對用戶通話時的語音信息進行加密。目前 , 常見 SIM 卡的存儲容量有 8 kB、16 kB、32 kB 和 64 kB 這幾 種 。從內容上看 , SIM 卡中所存儲的數據信息大致可分為五類 :
( 1) SIM 卡生產廠商存儲的產品原始數據 。
( 2)手機存儲的固有信息 , 主要包括各種鑒權和加密信 息 、GSIM 的 IM S I碼 、CDMA 的 M IN 碼 、IM S I認證演算法 、加密密匙生成演算法 。
( 3 )在手機使用過程中存儲的個人數據 ,如短消息 、電話 薄 、行程表和通話記錄信息 。
( 4 )移動網路方面的數據中包括用戶在使用 SIM 卡過程 中自動存入和更新的網路服務和用戶信息數據 ,如設置的周 期性位置更新間隔時間和最近一次位置登記時手機所在位置 識別號 。
( 5 )其它的相關手機參數 , 其中包括個人身份識別號
( P IN ) ,以及解開鎖定用的個人解鎖號 ( PU K)等信息 。
1. 2 手機內 /外置存儲卡
隨著手機功能的增強 ,手機內置的存儲晶元容量 呈現不斷擴充的趨勢。手機內存根據存儲數據的差
異可分為動態存儲區和靜態存儲區兩部分 (見圖 1 ) 。 動態存儲區中主要存儲執行操作系統指令和用戶應 用程序時產生的臨時數據 ,而靜態存儲區保存著操作 系統、各種配置數據以及一些用戶個人數據。
圖1 手機內存結構圖
從手機調查取證的角度來看,靜態存儲區中的數據往往具有更大的證據價值。GSIM 手機識別號IMEI、CDMA 手機識別號ESN、電話薄資料、收發與編輯的簡訊息,主/被叫通話記錄、手機的鈴聲、日期時間以及網路設置等數據都可在此存儲區中獲取。但是在不同的手機和移動網路中,這些數據在讀取方式和內容格式上會有差異 。另外,為了滿足人們對於手機功能的個性化需求,許多品牌型號的手機都提供了外置存儲卡來擴充存儲容量。當前市面上常見的外置存儲卡有SD、MiniSD和Memory Stick。外置存儲卡在處理涉及版權或著作權的案件時是一個重要的證據來源 。
1. 3 移動網路運營商
移動網路運營商的通話數據記錄資料庫與用戶注冊信息資料庫存儲著大量的潛在證據。通話數據記錄資料庫中的一條記錄信息包括有主/被叫用戶的手機號碼、主/被叫手機的IMEI號、通話時長 、服務類型和通話過程中起始端與終止端網路服務基站信息。 另外 ,在用戶注冊信息資料庫中還可獲取包括用戶姓名、證件號碼 、住址、手機號碼、SIM 卡號及其 P IN 和PU K、IM S I號和所開通的服務類型信息。在我國即將 實行「手機實名制 」的大環境下 ,這些信息可在日後案件調查取證過程中發揮巨大的實質性作用。
Ⅶ 計算機內存中存放的都是些什麼數據呢程序變數嗎
內存存放的數據分幾個區,不僅是存變數那麼簡單,如下:
1、棧區(stack):由編譯器自動分配和釋放
,存放函數的參數值、局部變數的值等,甚至函數的調用過程都是用棧來完成。其操作方式類似於數據結構中的棧
2、堆區(heap)
:一般由程序員手動申請以及釋放,
若程序員不釋放,程序結束時可能由OS回收
。注意它與數據結構中的堆是兩回事,分配方式類似於鏈表
3、全局區(靜態區)(static):全局變數和靜態變數的存儲是放在一塊的,初始化的全局變數和靜態變數在一塊區域,
未初始化的全局變數和未初始化的靜態變數在相鄰的另一塊區域。程序結束後由系統釋放空間
4、文字常量區:常量字元串就是放在這里的。
程序結束後由系統釋放空間
5、程序代碼區:存放函數體的二進制代碼
Ⅷ 什麼 是靜態內存區
從C程序運行的角度看,內存幾大部分:靜態存儲區、堆區和棧區。靜態存儲區:內存在程序編譯的時候就已經分配好,這塊內存在程序的整個運行期間都存在。它主要存放靜態數據、全局數據和常量。
Ⅸ c++全局/靜態存儲區和常量存儲區是一樣的嗎
當然不一樣,下面詳細講解一下內存分配的幾個區:
棧:
就是那些由編譯器在需要的時候分配,
在不需要的時候自動清除的變數的存儲區。
裡面的變數通常是局部變數、函數參數等。
在一個進程中,位於用戶虛擬地址空間頂部
的是用戶棧,編譯器用它來實現函數的調用。
和堆一樣,用戶棧在程序執行期間可以動態地擴展和收縮。
堆:
就是那些由new分配的內存塊,他們的釋放編譯器不去管,
由我們的應用程序去控制,一般一個new就要對應一個delete。
如果程序員沒有釋放掉,那麼在程序結束後,操作系統會自動回收。
堆可以動態地擴展和收縮。
自由存儲區,
就是那些由malloc等分配的內存塊,他和堆是十分相似的,
不過它是用free來結束自己的生命的。
全局/靜態存儲區,
全局變數和靜態變數被分配到同一塊內存中,
在以前的C語言中,全局變數又分為初始化的
和未初始化的(初始化的全局變數和靜態變數在一塊區域,
未初始化的全局變數與靜態變數在相鄰的另一塊區域,
同時未被初始化的對象存儲區可以通過void*來訪問和操縱,
程序結束後由系統自行釋放),在C++裡面沒有這個區分了,
他們共同佔用同一塊內存區。
常量存儲區,
這是一塊比較特殊的存儲區,他們裡面存放的是常量,不允許修改
Ⅹ 動態和靜態存儲區中數據的初始化有什麼不同
c語言中需要內存來存放數據。而內存主要分為兩類:靜態存儲區和動態存儲區;
1.靜態存儲區分為:只讀數據(READONLY DATA)區、以讀寫數據(RW DATA)區、未初始化區(BSS)。它們都是在程序編譯連接階段確定的,在程序執行的階段不會改變。
2.動態存儲區分為堆和棧。都是程序執行的過程中動態分配的,大小也隨之動態變化。從內存管理的實現的角度看來,堆使用的鏈表實現的,而棧使用的是線性存儲的方法。
棧:棧是先進後出,實際的操作中,棧內存可以有滿棧和空棧的情況,滿棧的情況下,棧指針當前的位子是已經使用的的棧區域;空棧的情況是,棧指針當前的位子是沒有使用的棧區域,所以兩種情況的出入棧,指針和數據的操作先後順序是不同的。
滿棧時:入棧,是先移動指針,在放入數據;出棧則是先出數據,在移動指針;
空棧時:入棧,是先放入數據,在移動指針。出棧則是先移動指針,在出數據;
C語言必須注意的幾個問題:
1.內存泄露:申請一塊內存,但沒有釋放,程序結束也沒回收,導致其他程序不能使用
2.野指針:指一個內存指針已經被釋放free或者realloc,但指針依然在使用。避免野指針的情況,將內存的指針置為NULL,並在程序使用的時候判斷該內存是否為NULL,如為空,則認為該內存已經釋放,不對內存進行訪問。
3.非法釋放內存:原則上講只有被malloc(),calloc()或realloc()分配並通過返回值返回返回的內存才能被釋放,否則釋放除此以外的內存都是非法的。即使有一個指針是*p是malloc,那麼對p1=p++,這個時候free(p1)也是不合法的,但free(p)確實可以的。同樣釋放函數中的局部變數也是非法的.還有一種情況是,對一個堆內存釋放兩次也是錯誤的用法。因為free()函數是不能釋放未分配的堆內存。在程序使用free釋放內存之後,應該將指針置為NULL,free一個NULL地址是沒有問題的。