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/