malloc和memset的理解
int main
{
char *p1 = "hello";
char *p2;
p2 = (char *)malloc(20);
//p2 = (char *)malloc(sizeof(char));
memset(p2,0,20);
while(*p2++ = *p1++)
printf("%s\n",p2);
return 0;
}
結果輸出5個空的換行。這裡主要考察++,*,=這些運算子的優先順序。
注意點;memset是對位元組操作的,memset(p2, 0, 20),這個 把20個位元組空間全部賦值為assic為0的值,就是null。
一、原型:extern void *malloc(unsigned int num_bytes);
標頭檔案:#include <malloc.h> 或 #include <alloc.h> (注意:alloc.h 與 malloc.h 的內容是完全一致的。)
功能:分配長度為num_bytes位元組的記憶體塊
說明:如果分配成功則返回指向被分配記憶體的指標,否則返回空指標NULL。
當記憶體不再使用時,應使用free()函式將記憶體塊釋放。
舉例:
- #include<stdio.h>
- #include<malloc.h>
- int main()
- {
- char *p;
-
p=(char *)malloc(100);
- if(p)
- printf("Memory Allocated at: %x/n",p);
- else
- printf("Not Enough Memory!/n");
- free(p);
- return 0;
- }
二、函式宣告(函式原型):
void *malloc(int size);
說明:malloc 向系統申請分配指定size個位元組的記憶體空間。返回型別是 void* 型別。void* 表示未確定型別的指標。C,C++規定,void* 型別可以強制轉換為任何其它型別的指標。這個在MSDN上可以找到相關的解釋,具體內容如下:
malloc returns a void pointer to the allocated space, or NULL if there is insufficient memory available. To return a pointer to a type other than void, use a type cast on the return value. The storage space pointed to by the return value is guaranteed to be suitably aligned for storage of any type of object. If size is 0, mallocallocates a zero-length item in the heap and returns a valid pointer to that item. Always check the return frommalloc, even if the amount of memory requested is small.
三、malloc與new的不同點
從函式宣告上可以看出。malloc 和 new 至少有兩個不同: new 返回指定型別的指標,並且可以自動計算所需要大小。比如:
int *p;
p = new int; //返回型別為int* 型別(整數型指標),分配大小為 sizeof(int);
或:
int* parr;
parr = new int [100]; //返回型別為 int* 型別(整數型指標),分配大小為 sizeof(int) * 100;
而 malloc 則必須由我們計算要位元組數,並且在返回後強行轉換為實際型別的指標。
int* p;
p = (int *) malloc (sizeof(int));
第一、malloc 函式返回的是 void * 型別,如果你寫成:p = malloc (sizeof(int)); 則程式無法通過編譯,報錯:“不能將 void* 賦值給 int * 型別變數”。所以必須通過 (int *) 來將強制轉換。
第二、函式的實參為 sizeof(int) ,用於指明一個整型資料需要的大小。如果你寫成:
int* p = (int *) malloc (1);
程式碼也能通過編譯,但事實上只分配了1個位元組大小的記憶體空間,當你往裡頭存入一個整數,就會有3個位元組無家可歸,而直接“住進鄰居家”!造成的結果是後面的記憶體中原有資料內容全部被清空。
malloc 也可以達到 new [] 的效果,申請出一段連續的記憶體,方法無非是指定你所需要記憶體大小。
比如想分配100個int型別的空間:
int* p = (int *) malloc ( sizeof(int) * 100 ); //分配可以放得下100個整數的記憶體空間。
另外有一點不能直接看出的區別是,malloc 只管分配記憶體,並不能對所得的記憶體進行初始化,所以得到的一片新記憶體中,其值將是隨機的。
除了分配及最後釋放的方法不一樣以外,通過malloc或new得到指標,在其它操作上保持一致。
總結:
malloc()函式其實就在記憶體中找一片指定大小的空間,然後將這個空間的首地址範圍給一個指標變數,這裡的指標變數可以是一個單獨的指標,也可以是一個數組的首地址,這要看malloc()函式中引數size的具體內容。我們這裡malloc分配的記憶體空間在邏輯上連續的,而在物理上可以連續也可以不連續。對於我們程式設計師來說,我們關注的是邏輯上的連續,因為作業系統會幫我們安排記憶體分配,所以我們使用起來就可以當做是連續的。