內存分配


1
2
3
void * malloc(usigned size);
void * realloc(void *ptr, unsigned newsize);
void * calloc(size_t numElements, size_t sizeofElement);</code>

malloc()在內存的動態存儲區中分配一塊長度爲size字節的連續區域。參數size爲需要的內存空間的長度,返回該區域的地址

calloc()malloc相似,參數sizeofElement爲申請地址的單位元素長度,numElements爲參數個數

realloc()是給一個已經分配了地址的指針重新分配空間,參數ptr爲原有的空間地址,newsize是重新申請的地址空間

區別如下:

malloc不能初始化所分配的內存空間,而函數calloc能。如果malloc函數分配的內存空間原來沒有被使用過,則其中的每一位可能都是0;反之,如果這部分內存曾經被分配過,則其中可能遺留各種各樣的數據,也就是說,使用malloc函數的程序開始時(內存還沒有被重新分配)能正常進行,但經過一段時間(內存已經被重新分配,可能會出現一些問題)。
calloc會將所分配的空間中的每一位都初始化爲零,也就是說如果你是字符類型或整數類型的元素分配內存,那麼這些元素將保證會被動的初始化爲0,如果你爲指針類型的元素分配內存,那麼這些元素通常會被初始化爲空指針。如果你爲實型元素分配內存,則這些元素會被初始化爲浮點型的0。
realloc可以對給定的指針所指向的空間進行擴大或縮小,無論是擴大還是縮小,原有的內存中的內容將保持不變,當然,對於縮小,則被縮小的那一部分的內容將會丟失,realloc並不保持調整後的內存空間和原來的 內存空間保持同一內存地址,realloc返回的指針很可能指向新的地址。

說明:malloc 向系統申請分配指定size個字節的內存空間。返回類型是 void* 類型。void* 表示未確定類型的指針。C,C++規定,void* 類型可以強制轉換爲任何其它類型的指針。
從函數聲明上可以看出。malloc 和 new 至少有兩個不同: new 返回指定類型的指針,並且可以自動計算所需要大小。

#include <stdio.h>  
#include <stdlib.h>  
int main ()
{
    int i,n;
    char * buffer;
    printf ("輸入字符串的長度:");
    scanf ("%d", &i);
    buffer = (char*)malloc(i+1);  // 字符串最後包含 \0
    if(buffer==NULL) exit(1);  // 判斷是否分配成功
    // 隨機生成字符串
    for(n=0; n<i; n++)
        buffer[n] = rand()%26+'a';
    buffer[i]='\0';
    printf ("隨機生成的字符串爲:%s\n",buffer);
    free(buffer);  // 釋放內存空間
    system("pause");
    return 0;
}





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章