C 中記憶體分配和釋放的函式

2021-08-14 03:32:25 字數 1228 閱讀 4822

c語言的標準記憶體分配函式有:malloc,calloc,realloc,free等。

c++的記憶體分配和釋放函式為new和delete。

下面對alloca、malloc、calloc、realloc等函式進行詳細說明。

alloca是向棧申請記憶體,無需進行釋放。

malloc分配的記憶體是位於堆中的,且沒有初始化記憶體中的內容,可以呼叫memset函式來初始化這部分的記憶體空間。

calloc會初始化所分配的記憶體,並且初始化為0.

realloc函式對malloc申請的記憶體進行大小的調整。

三個函式的宣告分別為:

void* malloc(unsigned size);

void* realloc(void* ptr,unsigned newsize);

void* calloc(size_t num,size_t size);

區別:1、函式malloc不能初始化所分配的記憶體空間,而函式calloc能。如果由malloc()函式分配的記憶體空間原來沒有被使用過,則其中的每一位可能都是0;

反之,如果這部分記憶體曾經被分配過,則其中可能遺留有曾經的資料。換句話說,使用malloc()函式的程式剛開始時(記憶體空間還沒有被重新分配)

能正常進行,但進過一段時間(記憶體空間已經被重新分配)可能會出現問題。

2、函式calloc會將所分配的記憶體空間都初始化為0 ,也就是說,如果是給字元型別或者整數型別的元素分配記憶體,那麼這些元素會被初始化為0;

如果是為指標型別的元素分配記憶體,那這些元素會被初始化為空指標;如果是為實型資料分配記憶體,則這些元素會被初始化為浮點型的零。

3、函式malloc向系統申請分配指定size個位元組的記憶體空間。返回型別是 void*型別.void*表示未確定型別的指標.c,c++規定,void* 型別可以強制轉換為任何其它型別的指標.

4、realloc可以對給定的指標所指的空間進行擴大或者縮小,無論是擴張或是縮小,原有記憶體的中內容將保持不變.當然,對於縮小,則被縮小的那一部分的內容會丟失.realloc並不保證調整後的記憶體空間和原來的記憶體空間保持同一記憶體位址.相反,realloc返回的指標很可能指向乙個新的位址.

5、realloc是從堆上分配記憶體的.當擴大一塊記憶體空間時,realloc()試圖直接從堆上現存的資料後面的那些位元組中獲得附加的位元組,如果能夠滿足,自然天下太平;如果資料後面的位元組不夠,問題就出來了,那麼就使用堆上第乙個有足夠大小的自由塊,現存的資料然後就被拷貝至新的位置,而老塊則放回到堆上.這句話傳遞的乙個重要的資訊就是資料可能被移動.

c和c 中的記憶體分配和記憶體釋放函式

c語言中的free 對應malloc 或delete 對應c 中的new 來釋放 例 char pt1,pt2 pt1 char malloc 100 pt2 pt1 free pt1 pt1 null return 0 第一行定義兩個字元指標,但沒有賦初值,編譯器只給pt1 pt2個分配兩個位元組...

記憶體分配和釋放

自從學習了c語言,老師就教導我們說 對於動態記憶體的申請和釋放,一定要遵守 誰申請,誰釋放 的原則。在此原則的指導下,不僅是我 不僅是你,就連特級大師都設計了這樣怪怪的函式 函式說明 getwindowtext hwnd,lptstr,int 取得視窗標題。需要在引數中給出儲存標題所使用的記憶體指標...

記憶體分配和釋放

三 記憶體分配和釋放 自從學習了c語言,老師就教導我們說 對於動態記憶體的申請和釋放,一定要遵守 誰申請,誰釋放 的原則。在此原則的指導下,不僅是我 不僅是你,就連特級大師都設計了這樣怪怪的函式 函式說明 getwindowtext hwnd,lptstr,int 取得視窗標題。需要在引數中給出儲存...