網站首頁 編程語言 正文
一、為什么存在動態內存分配
在c語言中我們目前掌握的內存開辟方式有:
int val = 20;//在棧空間上開辟四個字節 char arr[10] = {0};//在棧空間上開辟10個字節的連續空間
要么創建個變量,要么創建個數組。
這樣開辟出來的空間我們在使用的時候有時候會出現要么感覺空間過大,要么感覺空間過小,不夠靈活。
所以我們需要一種使空間可以變大變小的方法,這時候就出現了動態內存開辟。
但是上述的開辟空間的方式有兩個特點:
1. 空間開辟大小是固定的。
2. 數組在申明的時候,必須指定數組的長度,它所需要的內存在編譯時分配。 但是對于空間的需求,不僅僅是上述的情況。有時候我們需要的空間大小在程序運行的時候才能知道, 那數組的編譯時開辟空間的方式就不能滿足了。 這時候就只能試試動態存開辟了。
二、動態內存函數的使用
首先我們要了解數據,變量,函數是在內存中怎么存放的,如下圖所示:
1.malloc函數
(1)malloc的定義
?這個函數向內存申請一塊連續可用的空間,并返回指向這塊空間的指針。
(2)malloc函數的注意事項
1.如果開辟成功,則返回一個指向開辟好空間的指針。
2.如果開辟失敗,則返回一個NULL指針,因此malloc的返回值一定要做檢查。
3.返回值的類型是 void* ,所以malloc函數并不知道開辟空間的類型,具體在使用的時候使用者自己 來決定。
4.如果參數 size 為0,malloc的行為是標準是未定義的,取決于編譯器。
(3)malloc函數的使用
代碼如下:
#include//動態內存開辟 int main() { //假設開十個整型的空間 -- 10*sizeof(int) int arr[10];//棧區 //動態內存開辟 int* p = (int*)malloc(10 * sizeof(int)); //使用這些空間的時候 if (p == NULL) { perror("main");//main:xxxxxxxxxxx(錯誤信息) } //使用 int i = 0; for (i = 0; i < 10; i++) { *(p + i) = i; } for (i = 0; i < 10; i++) { printf("%d", p[i]);//p[i]-->*(p + i) } //回收空間 free(p);//malloc函數要配合free函數使用,使用完之后要主動釋放這塊空間 p = NULL;//釋放完了之后要把p置成空指針 return 0; }
2.calloc函數
(1)calloc函數的定義
C語言還提供了一個函數叫 calloc , calloc 函數也用來動態內存分配。
(2)calloc函數的注意事項
1.函數的功能是為 num 個大小為 size 的元素開辟一塊空間,并且把空間的每個字節初始化為0。
2.與函數 malloc 的區別只在于 calloc 會在返回地址之前把申請的空間的每個字節初始化為全0。
(3)calloc函數的使用
代碼如下:
#include//動態內存開辟 int main() { int* p = calloc(10,sizeof(int)); //使用這些空間的時候 if (p == NULL) { return 1; } int i = 0; for (i = 0; i < 10; i++) { printf("%d", p[i]);//p[i]-->*(p + i) } //回收空間 free(p);//malloc函數要配合free函數使用,使用完之后要主動釋放這塊空間 p = NULL;//釋放完了之后要把p置成空指針 return 0; }
打印結果如下:
需要注意點就是,calloc函數和malloc函數相比有兩點不同,
1.calloc函數的參數為兩個,malloc函數的參數為一個。?
2.malloc函數如果不初始化打印出來的都是隨機值,calloc函數不用初始化,會默認把申請的空間每個字節初始化為0。
3.realloc函數
(1)realloc函數的定義
realloc函數的出現讓動態內存管理更加靈活。
有時會我們發現過去申請的空間太小了,有時候我們又會覺得申請的空間過大了,那為了合理的時 候內存,我們一定會對內存的大小做靈活的調整。
那 realloc 函數就可以做到對動態開辟內存大小 的調整。
(2)realloc函數的注意事項
1.ptr 是要調整的內存地址
2.size 調整之后新大小 返回值為調整之后的內存起始位置。
3.這個函數調整原內存空間大小的基礎上,還會將原來內存中的數據移動到 新 的空間。
4.realloc在調整內存空間的是存在兩種情況:
情況1 當是情況1 的時候,要擴展內存就直接原有內存之后直接追加空間,原來空間的數據不發生變化。
情況2 當是情況2 的時候,原有空間之后沒有足夠多的空間時,擴展的方法是:在堆空間上另找一個合適大小 的連續空間來使用。這樣函數返回的是一個新的內存地址。 由于上述的兩種情況,realloc函數的使用就要注意一些。
(3)realloc函數的使用
#include//動態內存開辟 int main() { int* p = calloc(10,sizeof(int)); //使用這些空間的時候 if (p == NULL) { perror("main"); return 1; } int i = 0; for (i = 0; i < 10; i++) { *(p + i) = 5; }//這里需要P指向的空間更大,需要20個int空間的大小 //realloc調整空間大小 int* ptr = realloc(p, 20 * sizeof(int*)); if (ptr != NULL) { p = ptr; } //回收空間 free(p);//malloc函數要配合free函數使用,使用完之后要主動釋放這塊空間 p = NULL;//釋放完了之后要把p置成空指針 return 0; }
總結
本文僅僅簡單的介紹了動態內存函數的定義,注意事項和使用,還有free函數用來釋放動態內存開辟的空間,然后置為空。文章如果有任何問題,歡迎大佬提出疑問。我會虛心學習和改正,最重要的是能共同進步,共同成長,學好編程。
原文鏈接:https://blog.csdn.net/m0_64397675/article/details/122940939
相關推薦
- 2022-06-12 Python批量裁剪圖形外圍空白區域_python
- 2022-10-29 Clickhouse通過命令導入導出文件(在Linux命令窗口)
- 2023-02-12 Android?onbackpressed實現返回鍵的攔截和彈窗流程分析_Android
- 2024-04-04 springboot整合mongodb批量修改和添加索引,與設置mongodb保存更新超時時間
- 2023-03-01 Python中getservbyport和getservbyname函數的用法大全_python
- 2022-10-18 pandas重復行刪除操作df.drop_duplicates和df.duplicated的區別_p
- 2023-01-31 Android數據存儲幾種方式講解_Android
- 2022-11-13 Python?pandas按行、按列遍歷DataFrame的幾種方式_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支