堆內存雜記

按需分配。
大塊內存:堆內存管理者總量很大的操作系統內存塊,各進程可以按需申請使用,使用完釋放。
程序手動申請&釋放:手工意思是需要寫代碼去申請malloc和釋放free。
髒內存:堆內存也是反覆使用的,而且使用者用完釋放前不會清除,因此也是髒的。
臨時性:堆內存只在malloc和free之間屬於我這個進程,而可以訪問。在malloc之前和free之後都不能再訪問,否則會有不可預料的後果。
---堆內存使用範例
1void *是個指針類型,malloc返回的是一個void *類型的指針
爲什麼要使用void*作爲類型?主要原因是malloc幫我們分配內存時只是分配了內存空間
(2)什麼是void類型。void類型不表示沒有類型,而表示萬能類型。
(3)malloc的返回值:成功申請空間後返回這個內存空間的指針,申請失敗時返回NULL。所以malloc獲取的內存指針使用前一定要先檢驗是否爲NULL。
(4)malloc申請的內存時用完後要free釋放。free(p);
5)第一步:申請和綁定,int *p=(int*)malloc(1000*sizeof(int));
    第二步:檢驗配置是否成功,if(null==p)printf("malloc error!");
    第三步:使用;第四步:釋放,free(p);
---malloc的一些細節表現
    malloc(4)
gcc中的malloc默認最小是以16B爲分配單位的。如果malloc小於16B的大小時都會返回一個16字節的大小的內存。

代碼段:代碼段就是程序中的可執行部分,直觀理解代碼段就是函數堆疊組成的。
數據段(也被稱爲數據區、靜態數據區、靜態區):數據段就是程序中的數據,直觀理解就是C語言程序中的全局變量。(注意:全局變量纔算是程序的數據,局部變量不算程序的數據,只能算是函數的數據)
bss段(又叫ZI(zero initial)段):bss段的特點就是被初始化爲0,bss段本質上也是屬於數據段,bss段就是被初始化爲0的數據段。
---有些特殊數據會被放到代碼段
C語言中使用char *= "linux";定義字符串時,字符串"linux"實際被分配在代碼段,也就是說這個"linux"字符串實際上是一個常量字符串而不是變量字符串。
---C語言使用指針來管理字符串
*C語言中字符串有3個核心要點:第一是用一個指針指向字符串頭;第二是固定尾部(字符串總是以'\0'來結尾);第三是組成字符串的各字符彼此地址相連。
*'\0'是一個ASCII字符,其實就是編碼爲0的那個字符(真正的0,和數字0是不同的,數字0有它自己的ASCII編碼)。要注意區分'\0''0'0.(0等於'\0''0'等於48
---字符數組初始化與sizeof、strlen
(3)sizeof(數組名)得到的永遠是數組的元素個數(也就是數組的大小),和數組中有無初始化,初始化多、少等是沒有關係的;strlen是用來計算字符串的長度的,只能傳遞合法的字符串進去纔有意義
---字符串初始化與sizeof、strlen
(1)char *= "linux"sizeof(p)得到的永遠是4,因爲這時候sizeof測的是字符指針p本身的長度,和字符串的長度是無關的。
(2)strlen剛好用來計算字符串的長度。

    // 字符串存在棧上
    char a[7];    
    char *= a;
    
    // 字符串存在數據段
    char *= b;
    
    // 字符串存在堆空間
    char *= (char *)malloc(5);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章