c語言內存函數
① c語言中的內存重置函數怎麼寫
內存重置函數:從c地址開始重置size2個位元組,將每個位元組的內容重置為a
memset(c,a,size2)
② 例舉兩個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的引用會出問題。
③ C語言中對內存進行操作的標准庫函數有哪些
動態內存分配即分配內存大小在運行時才確定,一般在堆中分配。 C語言動態內存分配相關的函數如下幾個:malloc、calloc、realloc、free; malloc函數的使用比較直接,一個成功的malloc調用返回分配的size大小的內存的指針。失敗時返回NULL並將錯
④ 什麼是c語言裡面的動態存儲分配函數啊
動態內存分配即分配內存大小在運行時才確定,一般在堆中分配。
C語言動態內存分配相關的函數如下幾個:malloc、calloc、realloc、free;
malloc函數的使用比較直接,一個成功的malloc調用返回分配的size大小的內存的指針。失敗時返回NULL並將錯誤代碼置為ENOMEM。
calloc函數可以分配nr個size大小的內存空間,一般用於一組struct結構體的分配。
realloc函數將ptr指向的內存空間重新分配大小為size並返回新的內存首地址。
free函數釋放前三個函數申請的內存空間,所以,使用前三個分配函數分配的內存一定要free掉。
⑤ 在C語言中,具有動態申請內存塊功能的函數是
給你介紹兩個函數吧:
malloc函數 void * malloc(size) 動態內存分配函數,分配size位元組的內存,返回的是指向該區域的指針
realloc函數 void * realloc(void * ptr ,size)重新分配內存,將ptr所指的已分配內存塊的大小改為size,返回的也是指向該內存區域的指針
另外都包含在<stdlib.h>頭文件中
樓主說的就是malloc函數了,這兩個函數在數據結構中經常用到的
希望可以幫助你
⑥ C語言中分配內存的函數(double*)malloc( )中的(double*)是什麼意思
malloc() 函數的返回類型是 void *,代表任意類型的指針,在實際應用中需要把它轉型為申請類型的指針,(doube *) 是強制轉型運算符。
具體實例:
double*p=(double*)malloc(sizeof(double)*5);//分配5個double的存儲空間
malloc(n)分配長度為n 位元組的內存塊,sizeof(double) 表示一個 double 佔用的存儲空間,sizeof(double) * 5 就表示 5 個 double 佔用的存儲空間。
⑦ C語言中的malloc函數用法>
C語言中malloc是動態內存分配函數。
函數原型:void *malloc(unsigned int num_bytes)。
參數:num_bytes 是無符號整型,用於表示分配的位元組數。
注意:當內存不再使用時,應使用free()函數將內存塊釋放。函數返回的指針一定要適當對齊,使其可以用於任何數據對象。關於該函數的原型,在以前malloc返回的是char型指針,新的ANSIC標准規定,該函數返回為void型指針,因此必要時要進行類型轉換。
實現malloc的方法:
首先我們要確定所採用的數據結構。一個簡單可行方案是將堆內存空間以塊的形式組織起來,每個塊由meta區和數據區組成,meta區記錄數據塊的元信息(數據區大小、空閑標志位、指針等等)。
數據區是真實分配的內存區域,並且數據區的第一個位元組地址即為malloc返回的地址 。
⑧ C語言中分配內存的函數是怎麼寫的
Windows下的 malloc 原理就是調用 windows API 的各種內存管理函數申請內存並記錄內存狀態以便將來釋放。
DOS下的 malloc 原理就是調用申請內存的中斷申請內存並記錄內存狀態以便將來釋放。
UNIX 和 linux 都有內存管理的系統調用,malloc 相當於給這些系統調用穿了一件
malloc()工作機制
malloc函數的實質體現在,它有一個將可用的內存塊連接為一個長長的列表的所謂空閑鏈表。調用malloc函數時,它沿連接表尋找一個大到足以滿足用戶請求所需要的內存塊。然後,將該內存塊一分為二(一塊的大小與用戶請求的大小相等,另一塊的大小就是剩下的位元組)。接下來,將分配給用戶的那塊內存傳給用戶,並將剩下的那塊(如果有的話)返回到連接表上。調用free函數時,它將用戶釋放的內存塊連接到空閑鏈上。到最後,空閑鏈會被切成很多的小內存片段,如果這時用戶申請一個大的內存片段,那麼空閑鏈上可能沒有可以滿足用戶要求的片段了。於是,malloc函數請求延時,並開始在空閑鏈上翻箱倒櫃地檢查各內存片段,對它們進行整理,將相鄰的小空閑塊合並成較大的內存塊。
malloc()在操作系統中的實現
在 C 程序中,多次使用malloc () 和 free()。不過,您可能沒有用一些時間去思考它們在您的操作系統中是如何實現的。本節將向您展示 malloc 和 free 的一個最簡化實現的代碼,來幫助說明管理內存時都涉及到了哪些事情。
在大部分操作系統中,內存分配由以下兩個簡單的函數來處理:
void *malloc (long numbytes):該函數負責分配 numbytes 大小的內存,並返回指向第一個位元組的指針。
void free(void *firstbyte):如果給定一個由先前的 malloc 返回的指針,那麼該函數會將分配的空間歸還給進程的「空閑空間」。
malloc_init 將是初始化內存分配程序的函數。它要完成以下三件事:將分配程序標識為已經初始化,找到系統中最後一個有效內存地址,然後建立起指向我們管理的內存的指針。這三個變數都是全局變數:
//清單 1. 我們的簡單分配程序的全局變數
int has_initialized = 0;
void *managed_memory_start;
void *last_valid_address;
如前所述,被映射的內存的邊界(最後一個有效地址)常被稱為系統中斷點或者 當前中斷點。在很多 UNIX? 系統中,為了指出當前系統中斷點,必須使用 sbrk(0) 函數。 sbrk 根據參數中給出的位元組數移動當前系統中斷點,然後返回新的系統中斷點。使用參數 0 只是返回當前中斷點。這里是我們的 malloc 初始化代碼,它將找到當前中斷點並初始化我們的變數:
清單 2. 分配程序初始化函數
#include
void malloc_init()
{
last_valid_address = sbrk(0);
managed_memory_start = last_valid_address;
has_initialized = 1;
}
現在,為了完全地管理內存,我們需要能夠追蹤要分配和回收哪些內存。在對內存塊進行了 free 調用之後,我們需要做的是諸如將它們標記為未被使用的等事情,並且,在調用 malloc 時,我們要能夠定位未被使用的內存塊。因此, malloc 返回的每塊內存的起始處首先要有這個結構:
//清單 3. 內存控制塊結構定義
struct mem_control_block {
int is_available;
int size;
};
現在,您可能會認為當程序調用 malloc 時這會引發問題 —— 它們如何知道這個結構?答案是它們不必知道;在返回指針之前,我們會將其移動到這個結構之後,把它隱藏起來。這使得返回的指針指向沒有用於任何其他用途的內存。那樣,從調用程序的角度來看,它們所得到的全部是空閑的、開放的內存。然後,當通過 free() 將該指針傳遞回來時,我們只需要倒退幾個內存位元組就可以再次找到這個結構。
在討論分配內存之前,我們將先討論釋放,因為它更簡單。為了釋放內存,我們必須要做的惟一一件事情就是,獲得我們給出的指針,回退 sizeof(struct mem_control_block) 個位元組,並將其標記為可用的。這里是對應的代碼:
清單 4. 解除分配函數
void free(void *firstbyte) {
struct mem_control_block *mcb;
mcb = firstbyte - sizeof(struct mem_control_block);
mcb->is_available = 1;
return;
}
如您所見,在這個分配程序中,內存的釋放使用了一個非常簡單的機制,在固定時間內完成內存釋放。分配內存稍微困難一些。我們主要使用連接的指針遍歷內存來尋找開放的內存塊。這里是代碼:
//清單 6. 主分配程序
void *malloc(long numbytes) {
void *current_location;
struct mem_control_block *current_location_mcb;
void *memory_location;
if(! has_initialized) {
malloc_init();
}
numbytes = numbytes + sizeof(struct mem_control_block);
memory_location = 0;
current_location = managed_memory_start;
while(current_location != last_valid_address)
{
current_location_mcb =
(struct mem_control_block *)current_location;
if(current_location_mcb->is_available)
{
if(current_location_mcb->size >= numbytes)
{
current_location_mcb->is_available = 0;
memory_location = current_location;
break;
}
}
current_location = current_location +
current_location_mcb->size;
}
if(! memory_location)
{
sbrk(numbytes);
memory_location = last_valid_address;
last_valid_address = last_valid_address + numbytes;
current_location_mcb = memory_location;
current_location_mcb->is_available = 0;
current_location_mcb->size = numbytes;
}
memory_location = memory_location + sizeof(struct mem_control_block);
return memory_location;
}
這就是我們的內存管理器。現在,我們只需要構建它,並在程序中使用它即可.多次調用malloc()後空閑內存被切成很多的小內存片段,這就使得用戶在申請內存使用時,由於找不到足夠大的內存空間,malloc()需要進行內存整理,使得函數的性能越來越低。聰明的程序員通過總是分配大小為2的冪的內存塊,而最大限度地降低潛在的malloc性能喪失。也就是說,所分配的內存塊大小為4位元組、8位元組、16位元組、 18446744073709551616位元組,等等。這樣做最大限度地減少了進入空閑鏈的怪異片段(各種尺寸的小片段都有)的數量。盡管看起來這好像浪費了空間,但也容易看出浪費的空間永遠不會超過50%。
⑨ C語言中清除內存緩沖區的函數是什麼
是I/O 函數分為「帶緩沖」的和「不帶緩沖」的兩類。
帶緩沖的 I/O 函數寫數據時,並不直接寫磁碟介質,而是將數據先寫到這塊內存緩沖中,之後用戶空間緩沖中的數據會被傳送到系統緩沖中。
linux 內核會將系統緩沖中的數據送完磁碟驅動器(fsync函數可以加速這一過程),這之後,數據才真正的被寫入磁碟。
因為目前內存的讀寫速度往往遠大於硬碟的讀寫速度(常 ms 級)。因此,緩沖區的建立可以盡力避免太過頻繁的寫磁碟。
對於硬碟來說,寫入一個位元組可能跟寫入一個扇區沒什麼兩樣,程序員每次寫入的數據也許就幾個位元組,所以可以將每次寫入的幾個位元組放入緩沖區,排列組合成一整塊數據再寫入,也能極大的提升效率。
(9)c語言內存函數擴展閱讀
1、帶緩沖的 I/O 讀函數讀取數據之前,則會首先判斷用戶空間的進程緩沖區是否包含數據,如果沒有,則繼續判斷系統緩沖區是否包含數據。
2、「帶緩沖」的 I/O 讀函數從磁碟讀取數據時,並不只讀取調用者指定的讀取位元組數。讀函數可能一次性讀取一個扇區(常常是 512B)保存在緩沖區里,只返回給程序員需要的 10 位元組。
⑩ Linux中C語言處理動態內存分配的函數有那些
動態內存分配即分配內存大小在運行時才確定,一般在堆中分配。C語言動態內存分配相關的函數。
malloc
#include <stdlib.h>
void * malloc (size_t size);
malloc的使用比較直接,一個成功的malloc調用返回分配的size大小的內存的指針。失敗時返回NULL並將錯誤代碼置為ENOMEM。
教材中經常出現的用法是將malloc返回的void指針進行強制內存轉換然後賦給內存指針,其實是不必要的,在賦值時C語言是可以將void類型指針自動轉換成對應的指針的。
calloc
#include <stdlib.h>
void * calloc (size_t nr, size_t size);
calloc可以分配nr個size大小的內存空間,一般用於一組struct結構體的分配。
那麼calloc和malloc有什麼區別呢?拋開nr參數不談(malloc也可以將參數設置為nr*size達到一樣的效果),最關鍵的區別是malloc分配的內存是不保證初始化的,而calloc會將分配的內存都初始化為0.
realloc
#include <stdlib.h>
void * realloc (void *ptr, size_t size);
realloc函數將ptr指向的內存空間重新分配大小為size並返回新的內存首地址。具體的實現,函數首先會嘗試直接在已經分配的內存後進行padding,如果空間足夠那麼還是返回原來的地址,如果不夠,則會尋找新的空間並malloc size個位元組,之後再將原先的內容「搬家」到新的內存地址,所以函數的返回值可能和原指針相同,也可能不同。
另外,size參數如果是0,則該函數和free效果相同。如果ptr是NULL,函數的效果和malloc相同~
free
#include <stdlib.h>
void free (void *ptr);
釋放前三個函數申請的內存空間。關於free最經典的問題就是內存泄露(memory leak)。所以,使用前三個分配函數分配的內存一定要記得free掉。