指針malloc分配空間與數組區別

忘了是從哪看到一篇關於指針malloc分配空間與數組區別的文章了,講的不錯,然後轉載過來整理了一下,算是給自己做個備忘。

C語言中的數組:

    C沒有提供由語句來釋放已靜態定義的數組的措施。有以下幾種情況:

  1. 定義在函數中的自動存儲型數組,在函數被調用時創建,函數退出後自動釋放;

  2. 定義在主函數中或所有函數之外的全局數組與程序的壽命一樣長,不能中途釋放;

  3. 用static修飾的靜態數組,無論在何處定義,與程序的壽命一樣長,不能中途釋放;

  4. 用malloc函數申請的空間構成的數組,完成任務後可隨時用free函數釋放全部空間。


下面講  malloc分配空間與數組區別:

嚴格的說給指針malloc分配空間不等於數組,但是可以認爲它是個數組一樣的使用而不產生任何問題。
不過既然這樣,那它應該算是個數組吧。
所以,一般我們都用“動態數組”這種名字來稱呼這種東西。

要講清楚這個東西,涉及到malloc函數,指針類型和“[ ]”下標運算。

1、malloc函數:

malloc是C的標準庫函數之一,用來分配動態內存。

一般來說,由C/C++編譯的程序會在運行的時候在內存中佔用一些空間,它們分爲以下幾個部分:
1.二進制代碼區 不必過多解釋了,就是放二進制代碼的地方。
2.常量區 存放文字字符串和常量
3.靜態存儲區 存放靜態和全局變量
4.堆空間 動態內存區,程序員可控制分配和釋放的區域。
5.棧空間 由編譯器分配內存用於存儲函數參數和普通變量。

malloc能操作的是程序中的堆空間,而普通的數組則是存放在棧空間裏面的。
由於操作系統對這兩部分的內存管理模式差別很大,所以我們一般認爲是不同的。

堆空間是系統內存中的可用區域,和普遍意義上的“堆(Heap)”不同,基本上可以看作是由空閒內存組成的大鏈表。
嘛,操作系統怎麼處理這東西不管了,反正你就可以認爲堆空間是可用內存裏的一片連續區域。
malloc函數的作用就是從這一片內存中劃出一塊空間來。你可以認爲是malloc從內存中找到了一片可以安全存放數據的可用空間,這樣你的數據就可以放在這片空間裏面。這片空間的大小是你自己指定的。通過malloc(字節數)這樣簡單的方法。

爲了找到這片空間,malloc函數會告訴你這片空間開頭的地址,你可以把它賦值給一個變量存放起來。
這樣我們就知道申請到的這片內存的首地址(malloc返回)和大小(程序員指定)了。

2、指針類型:
C語言的指針也有類型,但是指針總是內存地址,是一個(32位/64位)二進制整數,長度也好大小也好都是確定的,理應一種類型就夠了。那麼,指針類型的作用是什麼呢?其實指針類型就是用於判斷指針所指向的數據的類型。

不得不說這是一個非常天才的設計。
指針裏存放着的是一個地址,它能找到一個內存單元(複雜的東西不說了,操作系統都給你做了,你就認爲是某一個字節就好。這個括號內部的東西寫給某些較真的人看,實際上並不存在一種叫做內存單元的東西。),但是數據有長有短,數據們有些存在1個內存單元裏面,有些存在多個內存單元裏面。
指針是爲了指向一個數據,那麼,用什麼方法可以知道這個指針想要的,到底是幾個內存單元裏的數據呢?

C語言裏用了一種十分巧妙的設計——指針類型。一個指針指向一個字節地址,這個指針的類型所代表的數據結構是8個字節,那麼我們就把這8個字節裏面的東西都讀出來,作爲這個指針所指向的數據的值。

舉個栗子:比如說從地址是1000開始的內存是以下的一片樣子:
00000001 00000010 00000011 00000100 00000101 00000110 00000111 00001000
00001001 00001010 00001011 00001100 00001101 00001110 00001111 00010000
然後我有個指針a,它的值是1000。
如果這個指針是int *a。當我用*a去訪問數據的時候,就會返回【00000001 00000010 00000011 00000100】
這些數據。
但是如果這個指針是double *a。當我用*a去訪問數據,返回的就是【00000001 00000010 00000011 00000100 00000101 00000110 00000111 00001000】這些數據了。

不過這個指針值可是沒有變化的,變化的只是指針類型而已。

3、[ ]運算符:

[ ]運算符是C語言幾乎最高優先級的運算符。[ ]運算符需要兩個操作數,一個指針類型,一個整數。/*補充[1]*/
標準的寫法是這樣的:。這樣編譯器會返回 *(a+i) 的值。
這樣做的話相當於一個十分好用的臨時指針的移動。
如果我要訪問第12個變量只需要寫a[11]就好了。編譯器會理解這個運算的規則,自動的把a指針進行一次以下的操作:
int *temp;temp=a+11;return *temp;
嗯,大概就是這個樣子。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章