前言
我們在之前學習的數組開辟的空間是固定不變的,有時候我們需要的空間??在程序運?的時候才能知道~
c語言中的動態內存開辟,讓程序員??可以根據實際需求申請和釋放相應空間,這使得空間的開辟變得靈活了許多。
歡迎關注個人主頁:逸狼
創造不易,可以點點贊嗎~
如有錯誤,歡迎指出~
目錄
前言
malloc函數
malloc函數的使用
free函數
free函數的使用
calloc函數
calloc函數的使用
realloc函數
realloc函數的使用
realloc與malloc函數的聯系
malloc函數
void* malloc (size_t size);
malloc函數的作用是開辟動態內存
這個函數向內存申請?塊連續可?的空間,并返回指向這塊空間的指針。
- 如果開辟成功,則返回?個指向開辟好空間的指針。
- 如果開辟失敗,則返回?個 NULL 指針,因此malloc的返回值?定要做檢查。
返回值的類型是 void* ,所以malloc函數并不知道開辟空間的類型,具體在使?的時候使?者??來決定。
如果參數 size 為0,malloc的?為是標準是未定義的,取決于編譯器。
malloc 申請的空間是在內存的堆區。
malloc函數的使用
#include<stdio.h>
#include<stdlib.h>//malloc所涉及的頭文件
int main()
{//int arr[10] = { 0 };//開辟的空間不可以更改,固定死了//void* malloc (size_t size) size的單位是字節//malloc函數只知道申請空間,不知道返回類型是什么int* p=(int*)malloc(40);//向內存申請40個字節的空間,他的返回值是void*//強制類型轉換成int*后,再賦值給指針變量p,就相當于int arr[10]if (p == NULL)//判斷p指針是否為空{perror("malloc");return 1;}//訪問并使用malloc開辟的空間for (int i = 0; i < 10; i++){*(p+i)=i;}//打印for (int i = 0; i < 10; i++){printf("%d " ,* (p + i));}return 0;
}
free函數
void free (void* ptr);
free函數?來釋放動態開辟的內存。
- 如果參數 ptr 指向的空間不是動態開辟的,那free函數的?為是未定義的。
- 如果參數 ptr 是NULL指針,則函數什么事都不做。
malloc和free都聲明在 stdlib.h 頭?件中。
free函數的使用
//釋放空間free(p);p = NULL;//用free釋放空間后,空間釋放了,但p仍然記得地址起始位置//避免p變為野指針,將p設為NULL
calloc函數
void* calloc (size_t num, size_t size);
- calloc函數也是?來動態內存分配。與malloc函數的區別 是calloc函數會將值全部初始化為0而malloc函數不會
- calloc函數的功能是num 個??為 size 的元素開辟?塊空間
calloc函數的使用
int main()
{// 元素個數,元素大小int* p = (int*)calloc(10,sizeof(int));if (p == NULL)//判斷p指針是否為空{perror("calloc");return 1;}//calloc函數會將值全部初始化為0//打印for (int i = 0; i < 10; i++){printf("%d ", *(p + i));}//釋放空間free(p);p=NULL;//避免p變為野指針,將p設為NULLz return 0;
}
realloc函數
void* realloc (void* ptr, size_t size);
realloc函數開辟空間有兩種情況:
- 原空間后面有足夠的空間,直接擴大,返回原空間的起始地址
- 原空間后面沒有足夠的空間,realloc會在堆區重新找一個空間(滿足需求的),并且把原數據拷貝到新的空間,然后釋放舊的空間,同時返回新空間的起始位置
realloc函數的使用
#include<stdio.h>
#include<stdlib.h>
int main()
{int* p=(int*)malloc(40);if (p == NULL)//判斷p指針是否為空{perror("malloc");return 1;}//若空間不夠,想要擴大空間,20個整形
//參數:(指針,想要變成的大小)int* ptr = (int*)realloc(p, 20 * sizeof(int));if (ptr != NULL)//先把判斷ptr是否為空指針,再把ptr賦值給p{//若直接用p接收,若開辟空間失敗,p會被置為NULL,造成原空間找不到了p = ptr;}else{perror("realloc");}
// realloc函數不會初始化空間
// 使用空間for (int i = 0; i < 20; i++){*(p+i)=i;}//打印for (int i = 0; i < 20; i++){printf("%d " ,* (p + i));}//釋放空間free(p);p = NULL;return 0;
}
realloc與malloc函數的聯系
以下代碼的意思是將指針為NULL的地址擴為40字節空間,相當于使用malloc函數開辟空間
int main()
{int* p = (int*)realloc(NULL, 40);//等價于mallocreturn 0;
}