動態記憶體開闢是根據使用者的需要來開闢開間,是在堆上開闢空間的。
用於開闢一塊連續的記憶體空間。
函式原型:void *malloc( size_t size );
malloc函式的返回值是乙個void型別的指標,引數為無符號型別資料即申請分配的記憶體大小,單位是位元組。
記憶體開闢成功,返回這塊空間的首位址,失敗返回空指標,所以需要判空處理,
if(p != null)。成功的話就需要指標來接受這個位址。但是由於函式的返回值是void * 的,所以需要強制轉換成你所接收的型別。接收存什麼型別的資料就轉換成什麼型別的指標。如下:
char *p=(char *)malloc(100);
在堆上分配100個位元組的空間,返回這塊空間首位址,把位址強轉成char 型別後賦給char 型別的指標變數p,同時說明這塊空間存放char型別的資料。
這裡有乙個問題????用malloc函式申請0位元組記憶體會返回空指標嗎?
答:測試一下,申請0位元組,函式並不返回空指標,而是返回乙個正常的位址。但是這塊大小為0的記憶體無法使用。這時候判空語句 if(p != null)將不起作用。。。
char*p = (char*)malloc(0);
printf("%p\n", p);
有開闢空間,就一定有分配。不然記憶體遲早會用完。來看一下free函式。
void test(void)
}
在free(p)之後,p所指向的記憶體被釋放,但是p所指的位址仍然不變。然後進行判空處理,這是一種無效的判空。所以free完之後一定要把指標置空。
用於開闢一塊連續的空間,並且把這塊空間初始化為0.
char*p = (char*)calloc(5, sizeof(int));
調整記憶體大小。
1.函式原型:void *realloc( void *memblock, size_t size );
2.功能:memblock是調整的記憶體塊的位址,size是調整後的記憶體大小。
3.返回值為調整之後的記憶體起始位置。
4. realloc調整記憶體空間有兩種情況:
原有空間之後有足夠的空間,要擴充套件記憶體之間在這塊位址後追加記憶體就可以了。
原有空間之後沒有足夠的空間,擴充套件的方法是:在堆上重新找一塊合適大小的空間來使用,這樣函式返回的是乙個新的記憶體位址空間。
int *ptr = malloc(100);
if (ptr != null)
else
int *p = null;
p = realloc(ptr, 2000);
if (p != null)
// 業務處理
free(ptr);
ptr = null;
先開闢一塊記憶體空間,發現不夠用,後再用realloc調整記憶體大小。用realloc在開闢時如果後邊的空間不夠用的話,會重新找一塊空間,這時返回的就是新的空間的位址。 (C語言)動態記憶體開闢
資料的元素儲存於記憶體中連續的位置上,當乙個陣列被宣告時,他所需要的內存在編譯時就被分配。當然,我們也可以使用動態記憶體分配在執行時為他分配記憶體。在動態記憶體分配中我們需要經常用到malloc,free,calloc,realloc這四個函式。malloc和free分別用於執行動態記憶體分配和釋放...
C語言 動態記憶體開闢
我們已經掌握的記憶體開闢方式有 int val 20 在棧空間上開闢四個位元組 char arr 10 在棧空間上開闢10個位元組的連續空間但是上述開闢空間的方式有兩個特點 1.空間開闢的大小是固定的。2.陣列在宣告的時候,必須指定陣列的長度,它所需要的內存在編譯時分配。但是對於空間的要求,不僅僅是...
C動態記憶體開闢
動態記憶體開闢 malloc calloc realloc 都是在堆上申請空間 一 malloc和free void malloc size t size 動態開闢記憶體 include include include int main int ptr int malloc 10 sizeof in...