內存分配

【2】內存管理
    (1)動態內存
	 1)C/C++定義了4個內存區間:
		代碼區/全局變量與靜態變量區常量(數字或者字符串)/局部變量區即棧區/動態存儲區,即堆區。
	 2)靜態存儲分配
		    一般定義變量,編譯器在編譯時均可以根據該變量的類型知道所需內存空間的大小,
		從、而系統在適當的時候爲他們分配肯定的存儲空間。
		    在棧上建立。在執行函數時,函數內局部變量的存儲單元均可以在棧上建立,
		函數執行結束時這些存儲單元自動被釋放。棧內存分配運算內置於處理器的指令集中,效率很高,
		可是分配的內存容量有限。
    (2)動態存儲分配
         1)有些操做對象只有在程序運行時才能肯定,這樣編譯器在編譯時就沒法爲他們預約存儲空間,
	    只能在程序運行時,系統根據運行時的要求進行內存分配,這種方法稱爲。
         2)全部動態存儲分配都在堆區中進行。
         3)從堆上分配,亦稱動態內存分配。程序在運行的時候用malloc申請任意多少的內存,
	    程序員本身負責在什麼時候用free釋放內存。動態內存的生存期由咱們決定,使用很是靈活,但問題也最多。
    (3)堆內存的分配與釋放
         1)   當程序運行到須要一個動態分配的變量或對象時,必須向系統申請取得堆中的一塊所需大小的存貯空間,
	    用於存貯該變量或對象。當再也不使用該變量或對象時,也就是它的生命結束時,要顯式釋放它所佔用的存貯空間,
	    這樣系統就能對該堆空間進行再次分配,作到重複使用有限的資源。
         2)   堆區是不會自動在分配時作初始化的(包括清零),因此必須用初始化式(initializer)來顯式初始化。
	 3)   malloc/free
     			void * malloc(size_t num)
     			void   free(void *p)
		a.  malloc函數自己並不識別要申請的內存是什麼類型,它只關心內存的總字節數。 
		b.  malloc申請到的是一塊連續的內存,有時可能會比所申請的空間大。其有時會申請不到內存,返回NULL。
		c.  malloc返回值的類型是void *,因此在調用malloc時要顯式地進行類型轉換,將void * 轉換成所須要的指針類型。 
		d.  若是free的參數是NULL的話,沒有任何效果。
		e.  釋放一塊內存中的一部分是不被容許的。

  

#include <stdio.h> #include <stdlib.h>

int main(int argc, const char *argv[])
{
    char *p;
    p = (char *)malloc(10*sizeof(char));

    if(p == NULL) { printf("malloc failed\n"); return 0;
    }
    printf("p = %p\n",p);
    printf("input:");
    scanf("%s",p);
    printf("%s\n",p);


    free(p);
    return 0;
}
相關文章
相關標籤/搜索