一、為什麼c語言中要有malloc
malloc就是memory allocate動態分配記憶體,malloc的出現時為了彌補靜態記憶體分配的缺點,靜態分配記憶體有如下缺點:
1、比如說,傳統的一維陣列,如int a[5],使用傳統的一維陣列需要事先指定陣列的長度,而且陣列的長度必須是乙個常量(巨集定義的 常量)
2、傳統陣列(靜態分配),不能手動釋放,只能等待系統釋放,靜態分配的變數在該函式內執行的時候有效,當靜態分配的變數所在函式執行完之後,該記憶體會自動釋放。靜態分配的記憶體,是在棧中分配的,其實在c語言中的函式呼叫也是通過棧來實現的,棧這種資料結構的乙個特點就是(先進後出),所以,在呼叫函式的時候,都是先壓入棧中,然後,再從最上面的函式開始執行,最後,執行到main函式結束。動態分配通過malloc分配,是在堆中分配的,堆不是一種資料結構,它是一種排序方式,堆排序。
3、傳統陣列的長度一旦定義之後,就不能更改,比如說,如果我有乙個業務在這之前給分配的大小為100,但是,我現在由於業務數量的增長,原來的大小就無法滿足。
4、靜態分配不能跨函式呼叫,就是無法在另乙個函式中,來管理乙個函式中的記憶體。靜態分配,只在當前函式有效,當,靜態分配所在的函式執行完之後,該變數就不能被其他的函式所呼叫。
二、malloc是什麼
malloc其實就是乙個可以動態分配記憶體的函式,從而可以很好的彌補上面靜態分配的缺點。
三、malloc怎麼使用
1、使用malloc函式的時候,需要包含乙個標頭檔案#include
2、malloc函式只接受乙個形參如,int *p = (int *)malloc(sizeof(int)).先來解釋下這句話的含義,int* p代表乙個以int型別位址為內容的指標變數,p這個變數佔4個位元組(某些計算機),這個p變數是靜態分配的乙個變數。在某些計算機的前提下,指標變數所佔的大小都是一樣的,無論是char* 還是long *,因為,這些指標變數裡面存放的是乙個8位16進製制的位址,所以佔四個位元組,當然這些都是在某些計算機的前提下,並不是所有的都是這樣的。說道位址的話,就和計算機的位址匯流排有關,如果計算機的位址匯流排是32根,每根位址匯流排只有兩種狀態(1或0),32根位址線的話,如果全為1的話,剛好就是乙個8位十六進製制,一位十六進製制等於四個二進位制(2^4=16)。32根位址匯流排可以 表示2^10*2^10*2^10*2^2種狀態,可以表示的最大記憶體為4g,也就是說32根位址匯流排(也就是四個位元組 的指標變數)最大可以表示4g記憶體。malloc函式會返回開闢空間的首位址,加(int *)的目的是讓計算機知道,如何去劃分這個開闢的空間,因為char、int 、long這些型別的位元組大小是不一樣的,我們知道了首位址,還要知道是以幾個位元組為單元。所以,這句話一共開闢了8個位元組(某些計算機上),這也是為什麼我寫sizeof(int),而不是直接寫4的原因。
3、malloc開闢空間所返回的首位址是動態分配的。
四、malloc函式的使用例子
# include # include int main(void)
# include # include void f(int * q)
int main(void)
C語言的指標(高階篇章之二)
而今天的主角 指標,則是用於儲存位址,它在c語言使用中和陣列名是緊密的聯絡在一起。include int main for int i 0 i 3 i putchar 10 研究陣列名a的大小 printf a p n a printf a 0 p n a 0 printf a 1 p t a 1 ...
c語言指標之二級指標示例
二級指標的概念 首先任何值都有位址,一級指標的值雖然是位址,但這個位址做為乙個值亦需要空間來存放,是空間就具有位址,這就是存放位址這一值的空間所具有的位址,二級指標就是為了獲取這個位址,一級指標所關聯的是其值 乙個位址 名下空間裡的資料,這個資料可以是任意型別並做任意用途,但二級指標所關聯的資料只有...
Crack C語言之 指標之二
c 語言嵌入式系統程式設計修煉之記憶體操作 資料指標 在嵌入式系統的程式設計中,常常要求在特定的記憶體單元讀寫內容,彙編有對應的 mov指 令,而除 c c 以外的其它程式語言基本沒有直接訪問絕對位址的能力。在嵌入式系統的 實際除錯中,多借助 c語言指標所具有的對絕對位址單元內容的讀寫能力。以指標直...