c/c++程序進程在內存中的表示包括:
- 文本段
- 初始化數據段
- 未初始化數據段
- 堆
- 棧
- 文本段, 也稱作代碼段。 主要包含可執行代碼,這部分是隻讀的。
- 初始化數據段,也通常簡稱爲數據段。它包含全局變量和由程序員初始化的靜態變量。
這部分還可以細分爲只讀部分和可讀可寫的部分,例如定義在主函數之外的變量(全局)
char s[] = "hello";
static int i = 1;
這兩個變量存儲在已初始化的讀寫區。
然而,全局變量
char *ss = "world"
;
變量*ss存儲的字符串“world”是存放在只讀部分(常量區)。
3. 未初始化數據段,常備稱爲BSS段(BlockStarted bySymbol),這部分通常存儲未被程序員初始化的變量,但是這些變量會被系統自動初始化爲0.,值得注意的是,那些被程序員初始化爲0的全局變量也會被存儲在這個區域。
4.堆,動態內存分配的區域,這部分區域被malloc,realloc 和 free 進行分配和釋放。堆一般是被程序中的動態共享庫和動態加載模塊所共享。
5.棧,一般位於內存的高地址處,動態的局部變量一般都存儲於棧中。
下面通過程序實例來演示程序各部分在內存中的分佈。
i.
#include <stdio.h>
int main(void)
{
return 0;
}
通過系統命令查看程序在內存各部分的分佈,
[narendra@CentOS]$ gcc memory-layout.c -o memory-layout
[narendra@CentOS]$ size memory-layout
text data bss dec hex filename
960 248 8 1216 4c0 memory-layout
ii. 增加一個全局變量之後,
#include <stdio.h>
int global; /* Uninitialized variable stored in bss*/
int main(void)
{
return 0;
}
[narendra@CentOS]$ gcc memory-layout.c -o memory-layout
[narendra@CentOS]$ size memory-layout
text data bss dec hex filename
960 248 12 1220 4c4 memory-layout
iii. 再增加一個未初始化靜態變量,
#include <stdio.h>
int global; /* Uninitialized variable stored in bss*/
int main(void)
{
static int i; /* Uninitialized static variable stored in bss */
return 0;
}
[narendra@CentOS]$ gcc memory-layout.c -o memory-layout
[narendra@CentOS]$ size memory-layout
text data bss dec hex filename
960 248 16 1224 4c8 memory-layout
iiii. 靜態變量初始化之後,
#include <stdio.h>
int global; /* Uninitialized variable stored in bss*/
int main(void)
{
static int i = 100; /* Initialized static variable stored in DS*/
return 0;
}
[narendra@CentOS]$ gcc memory-layout.c -o memory-layout
[narendra@CentOS]$ size memory-layout
text data bss dec hex filename
960 252 12 1224 4c8 memory-layout
v. 初始化全局變量之後,
#include <stdio.h>
int global = 10; /* initialized global variable stored in DS*/
int main(void)
{
static int i = 100; /* Initialized static variable stored in DS*/
return 0;
}
[narendra@CentOS]$ gcc memory-layout.c -o memory-layout
[narendra@CentOS]$ size memory-layout
text data bss dec hex filename
960 256 8 1224 4c8 memory-layout
翻譯自:http://www.geeksforgeeks.org/memory-layout-of-c-program/