Linux應用程序地址佈局

關於const常量在內存中的位置新認識

main函數外定義 const int a =1;//這裏存在代碼段,如果用指針去修改會出現段錯誤,訪問非法內存,因爲代碼段不允許寫
在函數內定義 const int b = 1;//這裏存在中,所以相當於只讀變量,可以利用指針修改

內存佈局

這裏寫圖片描述

代碼示例

test.c

#include <stdio.h>
#include <malloc.h> 
int global_init_a = 1;//全局、初始化、變量 :數據段 
int global_uninit_a;//全局 、未初始化、變量 :數據段
static int static_global_init_a = 1;//全局 靜態、初始化 :數據段
static int static_global_uninit_a;//全局、靜態、未初始化 :數據段
const int const_global_a = 1;//全局 常量 代碼段

void main()
{
    int local_init_a = 1;//局部、初始化:棧 
    int local_uninit_a;//局部 未初始化 :棧 
    static int static_local_init_a = 1;//數據段 
    static int static_local_uninit_a;//數據段 
    const int const_local_a = 1;//棧 
    malloc_p_a = malloc(sizeof(int));//堆 
    /*
    *打印各個數據的地址 
    */  
    while(1);   
}
  1. 編譯程序 gcc -g -test.c -o text
  2. 執行程序,停在死循環處
  3. 打開另外一個終端,自行 ps aux 查看進程的pid 例如這個程序爲 4902
  4. 執行 cat /proc/4902/maps 來查看這個程序的內存分佈輸出這裏寫圖片描述
    x:可執行程序
    w:可寫
    stack:堆
    0x08048000–0x08049000 爲代碼段
    0x08049000–0x0804a000 爲數據段
  5. 然後對照程序輸出地址可以對應都儲存在哪個段
    如何看.BSS段:使用 readelf -S 程序名
    這裏寫圖片描述
    0x000008表示寬度爲8
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章