内存中的分区

2017-07-24  本文已影响18人  charlotte2018

先看下如下代码

int a = 0; //全局初始化区
char *p1; //全局未初始化区
main()
{ 
    int b; //栈
    char s[] = "abc"; //栈
    char *p2; //栈
    char *p3 = "123456"; //123456\0在常量区,p3在栈上
    static int c =0; //全局(静态)初始化区
    p1 = (char *)malloc(10); //堆
    p2 = (char *)malloc(20);  //堆
}

再看看下面的图

1609713-eaa6e0729938352f.jpg

栈区

由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等。

堆区

一般由程序员分配释放, 若程序员不释放,程序结束时可能由操作系统回收。平时iOS中new对象都是创建在堆上的。

可读可写区(.data .bss)

可读可写区(全局区)(静态区)其实都是一个意思,存放全局变量和静态变量的。

.data段

一些全局或者静态的,且经过定义初始化过的变量,就属于该段;例如下面代码中的a,指针p以及b三个变量:

int a = 2;
int *p = &a;

int main () 
{
    static int b = 1;
...
...
    return 0;
}
.bss段

一些全局或者静态的,且未经过初始化的变量,属于.bss段。例如上文中.data段段的三个变量,如果不进行初始化,就会存储在本段中.

只读区(常量区)

.text段

真正组成程序的机器指令则存放在.text段中。一般情况下,在.text段中不进行数据项的定义。.text段包含名为标号的符号,这些符号用于标识跳转和调用程序代码位置。

常量

常量如const修饰的常量,字符串常量,都放在这个区。

理解了内存的分区之后,在我们后续的内存管理上,会理解的更深刻一些。

上一篇下一篇

猜你喜欢

热点阅读