C語言 07 記憶體

2021-08-17 07:33:40 字數 1410 閱讀 2576

前言: 程式的執行是放入記憶體中的,而我們在寫**時定義的變數, 函式等是儲存在記憶體的不同區域. 不同的區域有著不同的特性.1.四區: 棧區, 堆區, 全域性(靜態)區, 常量(**)區.
int func(int x, int y)

int main()

堆區,凡是手動malloc realloc calloc, 或者 c++中的new出來的變數都是儲存在堆區. 如果學過資料結構或者用過c++的話就會知道, 資料結構中的鍊錶是任意長度的,我們用c實現的話每個節點都是通過malloc函式建立出來的.而c++的話我們new出來的物件都是區域性物件, 這些都是我們自己手動申請建立的記憶體.

注意: 我們手動申請的在堆區的時候,如果我們不手動釋放(free)掉這段記憶體, 這段記憶體會一直占用直到程式結束. 手動釋放掉記憶體後切記將該指標置空.

當然c++通過new 出來的物件系統會自動呼叫析構函式釋放記憶體.

int *func(int x, int y)

int main()

全域性(靜態)區:故名思義,全域性變數和靜態變數(static)存放的在這個區.這個區域也叫可讀寫區, 分為.data和.bss兩部分,1 .data段(初始化全域性|靜態變數), 所有初始化了的全部變數存放的區域.則為資料分配空間,資料儲存在目標檔案中。2 .bss段(未初始化全域性|靜態變數), 所有未初化的全部變數存放的區域.不給該段的資料分配空間,只是記錄資料所需空間的大小。

int a;      //全域性(靜態)區

//int a = 0; //據說都是在.bss段

int b = 2; //全域性(靜態)區, .data段

void static fun_sta()

void func()

int main()

常量區: (也叫文字常量區)我們在程式中使用的一些整型常量, 浮點型常量, 還有乙個很容易誤會的字串常量都是存放在常量區.舉個簡單的例子: int a = 4; 我們知道a是存放在棧區的, &a的位址就是棧區的位址, 但是4卻是存放在常量區.畫圖幫助理解.
int main()
輸出結果:
panyiwen@god:~/temp$ ./a.out 

0x4006b4

0x4006b4

0x7ffe50893e90

可以看出指標s 和 s1指向的是同乙個位址, 而s2和前兩個都不同. 原因就是: s 和 s1 都是指向常量區的位址, 常量區只有乙個字串"abc", 而s2是乙個普通的區域性變數陣列, 那麼s2就是儲存在棧區的乙個字串畫圖理解:**區和常量區因為都是不可修改的, 所以這兩個區也被合併在一塊稱之為唯讀區.

鳴謝:希望能讓你能有所收穫, 不對的地方還請多多指教. 

07 C語言記憶體分析

c語言記憶體分析 一 進製 概念 進製是一種計數方式,是數值的表現形式 4種主要的進製 十進位制 0 9 二進位制 0和1 八進位制 0 7 十六進製制 0 9 a b c d e f c語言在預設的情況下為十進位制。int num 1010 十進位制 int num 0b1100 二進位制,以0b...

07 C語言 常量

常量是固定值,在程式執行期間不會改變。這些固定的值,又叫做字面量。常量可以是任何的基本資料型別,比如整數常量 浮點常量 字元常量,或字串字面值,也有列舉常量。常量就像是常規的變數,只不過常量的值在定義後不能進行修改。整數常量可以是十進位制 八進位制或十六進製制的常量。字首指定基數 0x 或 0x 表...

C語言I作業07

這個作業屬於那個課程 c語言程式設計ii 這個作業要求在 我在這個課程的目標是 熟練編寫 的格式要求,了解c語言的程式設計運用 這個作業在那個具體方面幫助我實現目標 編寫 的思維,錯誤總結等方面提公升了自己的編寫能力 參考文獻 c語言程式設計 1.1.1資料處理 資料表達 變數n,使用int型定義,...