C語言中一些關於記憶體四區的歸納
C語言中一些關於記憶體四區的歸納
博文參考傳送門
一、綜述
C語言程式中,程式碼是放在記憶體中執行的,我們大致將程式所佔用的記憶體分為四個區域:
-
棧區 堆區 資料區 程式碼區
每個程式都有唯一一個記憶體四區,我們應該掌握各個區域的特性,例如儲存哪種型別的資料,由誰去申請開闢,又由誰去管理釋放等等。
二、記憶體四區介紹
1. 棧區
由編譯器自動分配釋放,比如存放函式的引數值,區域性變數等。
例如:
void recive(int a,int b) {
int c;
}
其中,引數a,引數b和變數c都是存放在棧區,當函式執行完畢的時候,它們佔有的空間自動釋放。
2. 堆區
一般由程式設計師分配釋放(如動態記憶體申請<malloc函式>),若程式設計師不釋放,程式結束時可能由作業系統回收。
例如:
char *src;
src = (char*)malloc(4 *sizeof(char));//動態分配記憶體,表示查詢可用的連續4個位元組記憶體的空間,並將該記憶體首地址強制轉換為指向字元資料的指標賦給scr,為src這個指標變數分配4個char型別的空間。
3.資料區
分為兩種:1、常量區:存放常量,一般是字串常量。
2、全域性區(靜態區):存放全域性變數和靜態變數。
該區域是在程式結束後由作業系統釋放。
4.程式程式碼區
這個區域存放函式體的二進位制程式碼,也是由作業系統進行管理。
三、劃分記憶體四區的意義
C語言程式中,根據是區域性變數,全域性變數,常量還是其他,通過malloc等類似的函式分配記憶體空間,把他們放到對應的記憶體區中,這樣就賦予了這些變數或常量不同的生命週期。
根據我們程式的需要,我們在編寫程式碼過程中,宣告不同的變數型別,使他們有不同的宣告長度,不同的釋放方式,可以讓我們更加靈活地程式設計。
四、記憶體四區的一個例項
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i;
char* p1[3]= {"abc","def","ghi"};
char p2[3][4]= {"123","456","789"};
char** p3= (char**)malloc( 3 * sizeof(char*));
for(i=0;i < 3;i++)
{
p3[i]= (char *)malloc ( 5 * sizeof(char));
sprintf(p3[i],"%d%d%d",i,i,i);
/*
sprintf()函式:最常見的應用之一是把整數列印到字串中
例如:
srpintf(s,"%d",123);
輸出為:"123"
輸出結果不會列印在螢幕上,而是寫入字串中
*/
printf("%s\n",p3[i]);
/*
printf()函式才將結果輸出到螢幕上
*/
}
free(p3);
return 0;
}
示例程式碼圖示:
相關文章
- 程式的記憶體四區模型記憶體模型
- 第1天 C語言Dev-Cpp環境搭建及使用、C語言記憶體四區C語言dev記憶體
- android 關於記憶體優化的一些總結Android記憶體優化
- C語言的記憶體分配C語言記憶體
- C語言-記憶體分配C語言記憶體
- C語言中volatile關鍵字的作用C語言
- 關於redis記憶體分析,記憶體優化Redis記憶體優化
- C語言中Pointer, Array,String and Structures的區別C語言Struct
- c語言中的變數儲存區域C語言變數
- C語言記憶體對齊C語言記憶體
- C語言中結構體感悟C語言結構體
- 關於autoreleasepool記憶體管理記憶體
- 關於JavaScript的記憶體機制JavaScript記憶體
- C語言中容易混淆的const關鍵字C語言
- C語言中關鍵字typedef、enum的使用C語言
- C語言中的#和##C語言
- C語言中pi=&j和*pi=j的區別C語言
- c語言中作用域和儲存期的區別C語言
- C語言之動態記憶體管理C語言記憶體
- C和C++的動態記憶體管理的區別C++記憶體
- C語言中static關鍵字詳解C語言
- 關於 PHP 記憶體溢位的思考PHP記憶體溢位
- windows memeory 記憶體相關術語Windows記憶體
- 關於C/CPP使用結構體中位域的一些筆記結構體筆記
- C語言中四捨五入問題總結C語言
- C語言中宏定義都有那些盲區?C語言
- 解析C語言中的sizeofC語言
- C語言中extern的用法C語言
- c語言中的作用域C語言
- 關於虛擬機器記憶體和JVM記憶體設定的思考虛擬機記憶體JVM
- 【C語言】整型在記憶體中的儲存C語言記憶體
- 【C】 30_C語言中的字串C語言字串
- C語言中結構體直接賦值?C語言結構體賦值
- 關於C、Java、Python程式執行耗時及記憶體用量JavaPython記憶體
- 關於Vue和React區別的一些筆記VueReact筆記
- 關於PHP記憶體洩漏的問題PHP記憶體
- Go語言中defer的一些坑Go
- 記憶體四區之程式碼區,全域性區,棧區和堆區記憶體
- 探索 Go 語言中的記憶體對齊:為什麼結構體大小會有所不同?Go記憶體結構體