天天看點

linux裡面C程式記憶體布局

C程式的記憶體由以下部分組成:

正文段:由cpu執行的機器指令部分

初始化資料段:全局變量中已初始化部分

非初始化資料段:全局變量中未初始化部分

棧:局部變量和每次函數調用時所需儲存資訊都存放在此段

堆:通常在堆中進行動态存儲配置設定

這些段的一種典型排列方式是:

指令行參數和環境變量     高位址

未初始化資料段

初始化資料段

正文                             低位址

#include <stdio.h>

#include <unistd.h>

int g_init_a=0;

int g_init_b=0;

int g_a;

int g_b;

int fun()

{

return 0;

}

int main()

{

int a;

int b;

int *c = new int();

printf("指令行參數和環境變量/n");

printf("environ:/t%x/n",environ);

printf("棧/n");

printf("a:/t/t%x/n",&a);

printf("b:/t/t%x/n",&b);

printf("堆/n");

printf("c:/t/t%x/n",c);

printf("非初始化資料段/n");

printf("g_b:/t/t%x/n",&g_b);

printf("g_a:/t/t%x/n",&g_a);

printf("初始化資料段/n");

printf("g_init_a:/t%x/n",&g_init_a);

printf("g_init_b:/t%x/n",&g_init_b);

printf("正文段/n");

printf("fun:/t/t%x/n",fun);

return 0;

}

在linux2.6核心下用g++編譯器編譯的執行結果:

指令行參數和環境變量

environ:      c34b3718

a:                c34b3614

b:                c34b3610

c:                501010

非初始化資料段

g_b:            500cd8

g_a:            500cd4

初始化資料段

g_init_a:     500ccc

g_init_b:     500cd0

正文段

fun:             4006d8

 友情連結:網購優惠資訊網

繼續閱讀