以下是自己结合以前笔记的理解,欢迎纠正:
要明确这个问题,首先要明确程序运行时,系统内存的分配情况(虚拟内存):
这里说个大概,主要是堆和栈:(略去了系统的一些信息)
---------------------- 用户栈 ---------------------------
|
| 向下
|
----------------共享库存储器映射区域------------------
|
| 向上
|
----------------------运行时堆--------------------------
未初始化的数据(.bss段) |静态数据存储区
已初始化数据(.data段) |静态数据存储区
程序文件(text段)
-----------------------------------------------------------
现在来写一段程序:
#include <stdio.h>
// 下面三个全局变量
int a = 0; // 已初始化的数据a,放在.data段
static int b1 = 0; // 同样是已初始化的静态数据,放在.data
int a; // 未初始化数据, 放在.bss段
static int b1; // 未初始化静态数据, 放在.bss段
int main (void)
{
test();
}
void test(void)
{
static int c1 = 0; // 初始化的静态局部变量,存放在.data段
static int c2; // 未初始化的静态局部变量,存放在.bss段
int c3 = 0; // 存放在栈中
char *c4 = malloc(10); // 申请堆中内存,也就是c4指向的内存
/* 程序 */
}
综上:
以上的程序转换成机器码后存放在程序文件.text段。在MAC终端(UNIX系统即可)里可以通过readelf命令进行查看相应段的内容。
非静态的局部变量在运行时在栈里分配,全局变量和静态的局部变量存放在静态数据存储区。
而堆只能通过用户自己手动申请才能分配。
|