關於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);
}
- 編譯程序 gcc -g -test.c -o text
- 執行程序,停在死循環處
- 打開另外一個終端,自行 ps aux 查看進程的pid 例如這個程序爲 4902
- 執行 cat /proc/4902/maps 來查看這個程序的內存分佈輸出
x:可執行程序
w:可寫
stack:堆
0x08048000–0x08049000 爲代碼段
0x08049000–0x0804a000 爲數據段 - 然後對照程序輸出地址可以對應都儲存在哪個段
如何看.BSS段:使用 readelf -S 程序名
0x000008表示寬度爲8