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


之前寫了一篇堆棧的,這里再補充下內存其他的區域

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

#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.可以看到棧空間也是同一段內存 連續分配的,按內存地址減小方向分配

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

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

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

 

 

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM