linux进程中的内存结构

C程序存储区划分

  1. 栈(stack):由编译器进行管理,自动分配和释放,存放函数调用过程中的各种参数、局部变量、返回值以及函数返回地址。操作方式类似数据结构中的栈。
  2. 堆(heap):用于程序动态申请分配和释放空间。C语言中的malloc和free,C++中的new和delete均是在堆中进行的。正常情况下,程序员申请的空间在使用结束后应该释放,若程序员没有释放空间,则程序结束时系统自动回收。注意:这里的“堆”并不是数据结构中的“堆”。
  3. 全局(静态)存储区:分为DATA段和BSS段。DATA段(全局初始化区)存放初始化的全局变量和静态变量;BSS段(全局未初始化区)存放未初始化或初始化为0的全局变量和静态变量。程序运行结束时自动释放。其中BBS段在程序执行之前会被系统自动清0,所以未初始化的全局变量和静态变量在程序执行之前已经为0。
  4. 文字常量区:存放常量字符串。程序结束后由系统释放。
  5. 程序代码区:存放程序的二进制代码。

bss段存放未初始化或初始化为0的全局变量和静态变量

#include 


int a = 0;
int b;
int c = 5;

int main()
{
static int d = 0;
static int e;
static int f = 5;

printf("%p\n", &a);
printf("%p\n", &b);
printf("%p\n", &c);
printf("%p\n", &d);
printf("%p\n", &e);
printf("%p\n", &f);

return 0;
}

运行结果:

00404014
00404010
00402000
00404018
00404028
00402004

示例程序——注释为相关变量存储区域

//main.cpp 
int a = 0;   //bss段
char *p1;   //bss段
main() 

int b; //栈 
char s[] = "abc"; //栈,有赋值操作
char *p2; //栈
char *p3 = "123456";     //123456\0在常量区,p3在栈上。 
static int c =0;   //bss段
p1 = (char *)malloc(10); 
p2 = (char *)malloc(20); 
/*分配得来得10和20字节的区域就在堆区。 
strcpy(p1, "123456"); 123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。*/

你可能感兴趣的:(C语言学习笔记)