網(wǎng)站首頁 編程語言 正文
文章目錄
- 前言
- 1.malloc和free
- 2.calloc
- 3.realloc
前言
一些內(nèi)存的使用方式
1.創(chuàng)建一個變量
int a=1;//局部變量----棧區(qū)
int g_a=10;//全局變量----靜態(tài)區(qū)
1.malloc和free
void *(size_t size)
這個函數(shù)向內(nèi)存申請一塊連續(xù)可用的空間,并返回指向這塊空間的指針。
如果開辟成功,則返回一個人指向開辟好空間的地址。
如果開辟失敗,則返回一個NULL指針,因此malloc的返回值一定要做檢查。
返回值類型時void*,所以malloc函數(shù)并不知道開辟空間的類型,具體在使用的時候使用者自己決定。
如果參數(shù)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));
}
}
//當動態(tài)內(nèi)存不再使用的時候,
//應(yīng)該還給操作系統(tǒng)
free(p);
p = NULL;
return 0;
}
2.calloc
void* calloc(size_t num,size_t size)
函數(shù)功能是為num個大小為size的元素開辟一塊空間,并且把空間的每個字節(jié)初始化為0。
與malloc的區(qū)別只在于calloc會在返回地址之前把申請的空間的每個字節(jié)初始化為全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
調(diào)整動態(tài)開辟內(nèi)存空間的大小。
void* realloc(void* ptr ,size_t size);
ptr 是要調(diào)整的內(nèi)存地址
size 調(diào)整之后新大小
返回值為調(diào)整之后的內(nèi)存起始地址
函數(shù)調(diào)整原內(nèi)存空間大小的基礎(chǔ)上,還會將原來內(nèi)存中的數(shù)據(jù)移動到新的空間。
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指向的空間之后沒有足夠的內(nèi)存空間可以追加,則realloc函數(shù)會重新找一個新的內(nèi)存區(qū)域,開辟一塊滿足的空間,并把原來內(nèi)存中的數(shù)據(jù)拷貝回來,釋放舊的內(nèi)存空間。
3.得用一個新的變量來接收realloc函數(shù)的返回值。
原文鏈接:https://blog.csdn.net/weixin_47306453/article/details/126550174
相關(guān)推薦
- 2022-07-02 Python使用?TCP協(xié)議實現(xiàn)智能聊天機器人功能_python
- 2022-06-25 iOS使用UICollectionView實現(xiàn)拖拽移動單元格_IOS
- 2023-03-17 Pandas檢查dataFrame中的NaN實現(xiàn)_python
- 2023-01-03 Android序列化實現(xiàn)接口Serializable與Parcelable詳解_Android
- 2022-03-22 docker安裝RabbitMQ詳細步驟_docker
- 2023-11-21 python使用print輸出不同顏色的字體、終端顯示不同顏色字體
- 2022-08-05 C語言示例講解do?while循環(huán)語句的用法_C 語言
- 2022-09-24 ASP.NET?MVC實現(xiàn)文件下載_實用技巧
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支