c語言申請內存
1. c語言中,malloc和free是什麼意思
屬於內存管理的兩個函數,malloc是申請內存的,free是釋放內存的。
1、malloc一般用法:
int *t=NULL;
t=(int *)malloc(sizeof(int));
也可以在sizeof前面加上一個'n*'這就成了一個動態分配數組的方法。
2、free一般用法:
int *t=NULL;
t=(int *)malloc(sizeof(int));
free(t);
這樣t所指的空間就被釋放掉了。
(1)c語言申請內存擴展閱讀:
malloc函數定義
其函數原型為void *malloc(unsigned int size);其作用是在內存的動態存儲區中分配一個長度為size的連續空間。此函數的返回值是分配區域的起始地址,或者說,此函數是一個指針型函數,返回的指針指向該分配域的開頭位置。
如果分配成功則返回指向被分配內存的指針(此存儲區中的初始值不確定),否則返回空指針NULL。當內存不再使用時,應使用free()函數將內存塊釋放。
2. c語言內存怎麼回收和代碼是什麼
在C語言中,使用malloc來動態申請內存,申請完後必須釋放該空間。如果不手動釋放,那麼只能等程序運行結束後系統去回收,但在程序運行過程中容易造成內存溢出的問題,所以應該使用free(void*)來手動釋放申請的空間,這樣可以保證程序的健壯性。案例如下:x0dx0a #include "stdio.h"x0dx0a #include "stdlib.h"x0dx0a #include "string.h"x0dx0a void main()x0dx0a {x0dx0a //申請20個位元組空間x0dx0a char *str = (char*)malloc(20);x0dx0a //將空間內容設置為\0x0dx0a memset(str, '\0', 20);x0dx0a //為每個位元組空間賦值x0dx0a char *p = str;x0dx0a for (int i = 0; i < 10; i++)x0dx0a {x0dx0a *p++ = 'a' + i;x0dx0a }x0dx0a printf("str=%s\n",str);x0dx0a //釋放申請的空間,交回給系統x0dx0a free(str);x0dx0a }x0dx0a運行結果為:x0dx0astr=abcdefghijx0dx0aPress any key to continuex0dx0a x0dx0a這個案例很簡單,但也很能說明問題,我想應該對你幫助,呵呵。x0dx0a x0dx0a補充:在C++中,動態申請空間使用new方法(new方法底層調用的其實是malloc方法),釋放時使用delete方法(底層調用的是free)。
3. C語言-動態分配內存 malloc & free
需要用一個數組來保存用戶的輸入,但是卻不知道用戶會輸入多少條數據。
(1) 如果設一個太大的數組,則顯得浪費內存
(2) 如果設得太小,又怕不夠
問題:如何做到恰好夠用、又一點不浪費呢?
系統中存在一個內存管理器(MM, Memory Manager),它負責管理一堆閑置內存。它被設計用於解決此類問題。
MM提供的服務:應用程序可以向MM申請(借出)一塊指定大小的內存,用完之後再釋放(還回)。
應用程序在使用malloc時,要把返回值轉換成目標類型。
這塊內存和數組沒有本質區別,用法完全相同。
需要先計算需要多少位元組的內存空間
數組舉例子:
釋放的時候需要注意, 因為在for循環執行之後,p的地址往前移動了10, 所以需要減去10, 然後再釋放p,不然會有問題
// 當銷毀時只需要free一次,malloc了幾個位元組就會free幾個位元組,和char類型還是int類型無關
free(p);
在一個函數中動態分配的內存,在另一個函數中操作這塊內存
(1) MM是一個系統級的東西,所有的應用程序都向同一個MM申請內存。
(2) 何為借出?實際上,在內存被借出時,MM只是把它管理的內存標記了一下,表示該段內存已經被佔用。比如,它把每一段被佔用的內存給記錄下來(首地址,長度)
(p0,n0) (p1, n1) (p2, n2) ...
(3) MM非常慷慨:①只要有人 malloc ,它都同意借出 ②你不歸還,它永遠不會主動要求你 free 。
(4) MM管理的內存區域稱為「堆」Heap
這意味著,用戶程序應該自覺得及時 free ,以便不耽誤別的應用程序的使用。如果有個應用程序不停地 malloc ,而不 free ,那最終會用光MM的內存。當MM沒有更多閑置內存時, malloc 返回 NULL ,表示內存已經用完。
再次重申: 應用程序在malloc之後,應該盡早free !
使用原則:需要的時候再申請,不需要的時候立即釋放
實際上,MM對借出的內存塊進行標識
(p0, n0) (p1, n1) (p2, n2) ...
它內部已經保證任意兩塊內存不會「交疊」,即不會重疊,不會把一塊內存同時借給兩個應用程序使用。
所以,每塊內存的首地址都是不同的,在 free 的時候只需要指明首地址即可。
對象指的一塊內存
示例:用Citizen表示一個市民,用Car表示一個輛車。他起初沒有車,但未來可能有一輛車。
怎麼樣才算「及時」? 「不及時」會怎樣?
MM里可用的內存是有限的,你用完了就得盡快還,因為別的應用程序也需要MM的內存。
只借不還,積累到一定程度,MM沒有更多內存可用,於是malloc返回NULL。
要還就得全還,否則MM那邊處理不了
原因是:MM可能此時沒有閑置內存可用。(雖然這種情況一般不會發生)
free之後,該內存交還給MM,該內存不再可用(失效)
不一定要在相同的函數里釋放,在應用程序的任意一個角落釋放都是有效的。
也就是說:這一塊內存被malloc出來之後,完全交給你處置
功能:將 s 中當前位置後面的 n 個位元組 (typedef unsigned int size_t )用 ch 替換並返回 s
參數:
參數:
功能:由 src 所指內存區域復制 n 個位元組到 dest 所指內存區域。
memmove() 功能用法和 memcpy()) 一樣,區別在於: dest
和 src 所指的內存空間重疊時, memmove() 仍然能處理,不過執行效率比 memcpy() 低一些
4. 例舉兩個c語言中申請內存空間的函數
上面那個,你貌似不懂耶
看好了
malloc
原型:extern void *malloc(unsigned int num_bytes);
用法:#include <alloc.h>
功能:分配長度為num_bytes位元組的內存塊
說明:如果分配成功則返回指向被分配內存的指針,否則返回空指針NULL。
當內存不再使用時,應使用free()函數將內存塊釋放。
舉例:
// malloc.c
#include <syslib.h>
#include <alloc.h>
main()
{
char *p;
clrscr(); // clear screen
p=(char *)malloc(100);
if(p)
printf("Memory Allocated at: %x",p);
else
printf("Not Enough Memory!\n");
free(p);
getchar();
return 0;
}
free
原型:extern void free(void *p);
用法:#include <alloc.h>
功能:釋放指針p所指向的的內存空間。
說明:p所指向的內存空間必須是用calloc,malloc,realloc所分配的內存。
如果p為NULL或指向不存在的內存塊則不做任何操作。
舉例:
// free.c
#include <syslib.h>
#include <alloc.h>
main()
{
char *p;
clrscr(); // clear screen
textmode(0x00);
p=(char *)malloc(100);
if(p)
printf("Memory Allocated at: %x",p);
else
printf("Not Enough Memory!\n");
getchar();
free(p); // release memory to reuse it
p=(char *)calloc(100,1);
if(p)
printf("Memory Reallocated at: %x",p);
else
printf("Not Enough Memory!\n");
free(p); // release memory at program end
getchar();
return 0;
}
為什麼很多人不喜歡c,c++,因為管理內存的一部分任何必須由程序員自己管理,不然很容易內存泄露,現在有很多檢查內存泄露的軟體比較常用的有(boundchecker)有興趣的可以下個試一下自己的程序,你會發現自己好可怕。malloc free使用一般有幾個原則(自己總結的,不一定正確,但很實用)
1 ,malloc free必須配套使用,並且盡可能逆序。
2 ,誰malloc的誰free
3,能夠不動態分配的盡量不動態分配,動態分配是很費時間的,而且存在一定的風險。
很多人喜歡這樣寫程序:
type * f()
{
type *t = (type*)malloc ( sizeof(type));
.
.
return t ;
}
這個肯定會出問題,一般象這種情況,一般聲明f(type* t),誰調用它誰為t分配空間,誰來釋放它的空間。不過很有意思的是,在有寫系統函數的會這樣.如(char* asctime() ,它返回一個表示時間的字元指針,但是並不要求你釋放,你也沒有辦法釋放,但是我可以肯定它這個串肯定不是在堆區分配的)
free的順序也很重要,很多時候free的時候會出現空指針的引用,不足為齊。有人提議free(t);t = NULL ;這種用法,有一定的道理,當你free一塊空間後,操作系統不會立即回收,所以在你再次用t的時候可能還是可以用的,t就成了個野指針,而將其t = NULL後,對t的引用會出問題。
5. 在C語言中,具有動態申請內存塊功能的函數是
給你介紹兩個函數吧:
malloc函數 void * malloc(size) 動態內存分配函數,分配size位元組的內存,返回的是指向該區域的指針
realloc函數 void * realloc(void * ptr ,size)重新分配內存,將ptr所指的已分配內存塊的大小改為size,返回的也是指向該內存區域的指針
另外都包含在<stdlib.h>頭文件中
樓主說的就是malloc函數了,這兩個函數在數據結構中經常用到的
希望可以幫助你