網站首頁 編程語言 正文
文章目錄
- 前言
- 1.malloc和free
- 2.calloc
- 3.realloc
前言
一些內存的使用方式
1.創建一個變量
int a=1;//局部變量----棧區
int g_a=10;//全局變量----靜態區
1.malloc和free
void *(size_t size)
這個函數向內存申請一塊連續可用的空間,并返回指向這塊空間的指針。
如果開辟成功,則返回一個人指向開辟好空間的地址。
如果開辟失敗,則返回一個NULL指針,因此malloc的返回值一定要做檢查。
返回值類型時void*,所以malloc函數并不知道開辟空間的類型,具體在使用的時候使用者自己決定。
如果參數size為0,malloc的行為是標準是未定義的,取決于編譯器。
int main() {
// 開辟10個整型的空間
int* p =(int*) malloc(10 * sizeof(int));
if (p == NULL) {
printf("%s\n", strerror(errno));
}
else {
int i = 0;
for (i = 0; i < 10; i++) {
*(p + i) = i;
}
for (i = 0; i < 10; i++) {
printf("%d ", *(p + i));
}
}
//當動態內存不再使用的時候,
//應該還給操作系統
free(p);
p = NULL;
return 0;
}
2.calloc
void* calloc(size_t num,size_t size)
函數功能是為num個大小為size的元素開辟一塊空間,并且把空間的每個字節初始化為0。
與malloc的區別只在于calloc會在返回地址之前把申請的空間的每個字節初始化為全0.
int main() {
int*p =(int*)calloc(10, sizeof(int));
if (p == NULL) {
printf("%s\n", strerror(errno));
}
else {
int i = 0;
for (i = 0; i < 10; i++) {
printf("%d ", *(p + i));
}
}
free(p);
p = NULL;
return 0;
}
3.realloc
調整動態開辟內存空間的大小。
void* realloc(void* ptr ,size_t size);
ptr 是要調整的內存地址
size 調整之后新大小
返回值為調整之后的內存起始地址
函數調整原內存空間大小的基礎上,還會將原來內存中的數據移動到新的空間。
int main() {
int* p = (int*)malloc(20);
if (p == NULL) {
printf("%s\n", strerror(errno));
}
else {
int i = 0;
for (i = 0; i < 5; i++) {
*(p + i) = i;
}
}
int* ptr = (int*)realloc(p, 40);
if (ptr != NULL) {
p = ptr;
int i = 0;
for (i = 5; i < 10; i++) {
*(p + i) = i;
}
for (i = 0; i < 10; i++) {
printf("%d ", *(p + i));
}
}
else {
printf("%s\n", strerror(errno));
}
free(p);
p = NULL;
return 0;
}
realoc使用注意:
1.如果p指向的空間之后有足夠的空間可以追加,則直接返回,返回p。
2.如果p指向的空間之后沒有足夠的內存空間可以追加,則realloc函數會重新找一個新的內存區域,開辟一塊滿足的空間,并把原來內存中的數據拷貝回來,釋放舊的內存空間。
3.得用一個新的變量來接收realloc函數的返回值。
原文鏈接:https://blog.csdn.net/weixin_47306453/article/details/126550174
相關推薦
- 2021-12-29 Android中String與int相互轉換_Android
- 2022-10-31 ViewPager實現圖片切換效果_Android
- 2022-09-21 Shell自動化配置SSH免密登錄和取消SSH免密配置腳本_linux shell
- 2023-07-15 css 多余部分用省略號代替
- 2022-03-16 C++?explicit關鍵字講解_C 語言
- 2022-04-17 ajax請求成功后,設定一定時間過后執行關閉窗口命令
- 2022-07-23 詳解NumPy中的線性關系與數據修剪壓縮_python
- 2022-06-18 C++深入講解初始化列表的用法_C 語言
- 最近更新
-
- 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同步修改后的遠程分支