網站首頁 編程語言 正文
C 程序中,不同數據在內存中分配說明
1)全局變量——內存中的靜態存儲區
2)非靜態的局部變量——內存中的動態存儲區——stack 棧
3)臨時使用的數據—建立動態內存分配區域,需要時隨時開辟,不需要時及時釋放——heap 堆
4)根據需要向系統申請所需大小的空間,由于未在聲明部分定義其為變量或者數組,不能通過變量名或者數組名 來引用這些數據,只能通過指針來引用)
內存動態分配的相關函數
1)頭文件#include
聲明了四個關于內存動態分配的函數
2)函數原型?void * malloc(usigned int size) //memory allocation
- 作用——在內存的動態存儲區(堆區)中分配一個長度為 size 的連續空間。
- 形參 size 的類型為無符號整型,函數返回值是所分配區域的第一個字節的地址,即此函數是一個指針型函數, 返回的指針指向該分配域的開頭位置。
- malloc(100); 開辟 100 字節的臨時空間,返回值為其第一個字節的地址
3)函數原型void *calloc(unsigned n,unsigned size)
作用——在內存的動態存儲區中分配 n 個長度為 size 的連續空間,這個空間一般比較大,足以保存一個數組用 calloc 函數可以為一維數組開辟動態存儲空間,n 為數組元素個數,每個元素長度為 size.函數返回指向所分配域的起始位置的指針;分配不成功,返回 NULL。p = calloc(50, 4); //開辟 50*4 個字節臨時空間,把起始地址分配給指針變量 p
4)函數原型:void free(void *p)
作用——釋放變量 p 所指向的動態空間,使這部分空間能重新被其他變量使用。p 是最近一次調用 calloc 或 malloc 函數時的函數返回值free 函數無返回值free (p ); // 釋放 p 所指向的已分配的動態空間
5) 函數原型void *realloc(void *p,unsigned int size)
作用——重新分配 malloc 或 calloc 函數獲得的動態空間大小,將 p 指向的動態空間大小改變為 size,p 的值不 變,分配失敗返回 NULLrealloc(p, 50); // 將 p 所指向的已分配的動態空間 改為 50 字節
6)返回類型說明
?
應用實例
動態創建數組,輸入 5 個學生的成績,另外一個函數檢測成績低于 60 分的,輸出不合格的成績。
代碼演示
#include <stdlib.h> #include <stdio.h> int main() { void check(int *); int * p,i; // 在堆區開辟一個 5 * 4 的空間,并將地址 (void *) , 轉成 (int *) , 賦給 p p = (int *)malloc(5*sizeof(int)); for( i = 0; i < 5; i++) { scanf("%d", p + i); } check(p); // free(p); //銷毀 堆區 p 指向的空間 getchar(); getchar(); return 0; } void check(int *p) { int i; printf("\n不及格的成績 有: "); for(i =0; i < 5; i++) { if(p[i] < 60) { printf(" %d ", p[i]); } } }
動態分配內存的基本原則
1)避免分配大量的小內存塊。分配堆上的內存有一些系統開銷,所以分配許多小的內存塊比分配幾個大內存塊的 系統開銷大
2)僅在需要時分配內存。只要使用完堆上的內存塊,就需要及時釋放它(如果使用動態分配內存,需要遵守原則: 誰分配,誰釋放),?否則可能出現內存泄漏
3)總是確保釋放以分配的內存。在編寫分配內存的代碼時,就要確定在代碼的什么地方釋放內存
4)在釋放內存之前,確保不會無意中覆蓋堆上已分配的內存地址,否則程序就會出現內存泄漏。在循環中分配內 存時,要特別小心
5)指針使用一覽
總結
原文鏈接:https://blog.csdn.net/weixin_45417821/article/details/122190086
- 上一篇:開機時自動運行批處理
- 下一篇:C++using聲明和using編譯指令_C 語言
相關推薦
- 2022-04-04 elementui組件select選擇不中的問題(組件select選擇器無法顯示選中的內容)
- 2022-06-24 Go單體服務開發最佳實踐總結_Golang
- 2022-08-20 Python簡明講解filter函數的用法_python
- 2022-12-15 C#入參使用引用類型要加ref的原因解析_C#教程
- 2021-11-28 C#?通過同步和異步實現優化做早餐的時間_C#教程
- 2022-09-22 k8s 存儲卷之 PV & PVC
- 2023-01-05 詳解C++中四種類型的轉換_C 語言
- 2022-05-02 Python中pyautogui庫的使用方法匯總_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同步修改后的遠程分支