先看下如下代码
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); //堆
}
再看看下面的图
栈区
由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等。
堆区
一般由程序员分配释放, 若程序员不释放,程序结束时可能由操作系统回收。平时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修饰的常量,字符串常量,都放在这个区。