從內存的角度觀察 堆、棧、全局區(靜態區)(static)、文字常量區、程序代碼區

以前寫了一篇堆棧的,這裏再補充下內存其餘的區域ios

一、棧區(stack)— 由編譯器自動分配釋放 ,存放函數的參數值,局部變量的值等。其操做方式相似於數據結構中的棧。
二、堆區(heap) — 通常由程序員分配釋放 , 若程序員不釋放,程序結束時可能由OS回收 。注意它與數據結構中的堆是兩回事,分配方式卻是相似於鏈表。
三、全局區(靜態區)(static)—,全局變量和靜態變量的存儲是放在一塊的,初始化的全局變量和靜態變量在一塊區域, 未初始化的全局變量和未初始化的靜態變量在相鄰的另外一塊區域(BSS)。 - 程序結束後由系統釋放
四、文字常量區 — 常量字符串就是放在這裏的。 程序結束後由系統釋放
五、程序代碼區— 存放函數體的二進制代碼。程序員

#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#include<string.h>
using namespace std;

static int a=1;//全局初始化區 
int b=2;//全局初始化區 
char *p;//全局未初始化區 
char *p2;//全局未初始化區 
int *p3;//全局未初始化區 
int *p4;//全局未初始化區 
char *p5={"555555555"};//全局初始化區 

int main(){
    static int c=3;
    int d=4;//內存棧
    int e=7;//內存棧
    
    char *p6={"555555555"};
    p=(char*)malloc(sizeof(char)*10);//內存堆
    p2=(char*)malloc(sizeof(char)*10);//內存堆
    p3=(int*)malloc(sizeof(int));//內存堆
    p4=(int*)malloc(sizeof(int)*10);//內存堆
    for(int i=0;i<=9;i++)p4[i]=0x1;


    *p3=0x123;
    strcpy(p,"123456789");//文字常量區
    strcpy(p2,"987654321");
    strcpy(p2,"123456789");
}

 

 

1.能夠看到全局初始化區與全局(靜態)初始化區是在同一段內存 連續分配的,按內存地址增加方向分配數據結構

2.全局初始化區與全局未初始化區不在同一段內存區,全局初始化區好像按內存地址增加方向分配,全局未初始化區好像按內存增加的方向貌似沒有規律!!函數

3.能夠看到棧空間也是同一段內存 連續分配的,按內存地址減少方向分配spa

4.能夠看到堆空間也是同一段內存 連續分配的,按內存地址增大方向分配指針

5.文字常量區在本身特有的內存段內,且有機制控制字符常量不被修改(當字符串相同的時候,系統有時還會將兩個指針指向同一處)code

注意 :在文字常量區的字符串不能夠被修改,而在內存堆空間的字符串能夠被修改!!blog

 

 

如此,代碼區又有特定的內存區。內存

相關文章
相關標籤/搜索