C/C++ 程序进程在内存中的分布

c/c++程序进程在内存中的表示包括:

  1. 文本段
  2. 初始化数据段
  3. 未初始化数据段

  1. 文本段, 也称作代码段。 主要包含可执行代码,这部分是只读的。
  2. 初始化数据段,也通常简称为数据段。它包含全局变量和由程序员初始化的静态变量。
    这部分还可以细分为只读部分和可读可写的部分,例如定义在主函数之外的变量(全局)
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/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值