天天看點

[Linux] c語言變量的存儲位置-筆記c語言變量的存儲位置

c語言變量的存儲位置

#include <stdio.h>

/* 配置設定在 .rodata段, 
	程式加載時.rodata段和.text 段通常合并到一個Segment中,
	隻讀,GLOBAL 
*/
const int A = 10;  

// 配置設定在 .data段,GLOBAL
int a = 20;  

// 配置設定在 .data段,LOCAL,隻能在某一個目标檔案中定義和使用
static int b = 30; 

/*  配置設定在 .bss 段(緊挨着.data段),
	.data 和 .bss 段加載時合并到一個Segment中, 可讀可寫,
	.bss 段在檔案中不占存儲空間,在加載時這個段用0填充,全局變量如果不初始化則初值為0,
	同理可以推斷,static變量(不管是函數裡的還是函數外的)如果不初始化則初值也是0,也配置設定在.bss 段。
*/
int c; 

// 都配置設定在 .bss 段
static int d;
const int e; 

// 都配置設定在 .rdata 段
static const f = 20;
const static g = 30;

int main(void) {
	// 靜态配置設定在 .data, a.2050區分全局變量a
    static int a = 40;  
    
    // 函數的參數和局部變量是配置設定在棧上的,通過三條movl指令把12個位元組寫到棧上
    char b[] = "Hello world"; 
    
    // c并沒有在棧上配置設定存儲空間,而是直接存在eax 寄存器裡,這就是register 關鍵字的作用
    register int c = 50; 
    
    // 配置設定在.bss段, d.2054 
    static int d;
    
    printf("Hello world %d\n", c);
    
    return 0;
}

           

檢視方法

gcc main.c -g 
readelf -a a.out
objdump -dS a.out
           

存儲類修飾符

  • static,用它修飾的變量的存儲空間是靜态配置設定的,用它修飾的檔案作用域的變量或函數 具有Internal Linkage。
  • auto,用它修飾的變量在函數調用時自動在棧上配置設定存儲空間,可以省略不寫。
  • register,用register 修飾的變量會盡可能配置設定一個專門的寄存器來存儲。現在一般編譯器的優化都做得很好了,它自己會想辦法有效地利用CPU的寄存 器,是以現在register 關鍵字也用得比較少了。
  • extern,不是用來修 飾變量的,而是定義一個類型名。

繼續閱讀