最近在看《C++primer》和《APUE》,没搞懂这个存储空间布局的问题。
1.书上说C是分为栈,堆,未初始化数据段(bss段),已初始化数据段(数据段),程序代码区(正文段)。还有在栈和堆之间还加了个内存映射段的。
2.网上有说C++分区布局是堆、栈、自由存储区、全局/静态存储区和常量存储区的。(其实这种分法少说了一个程序代码区,自由存储区应该属于堆,区别不过是用malloc还是new来进行分配)
3.还有说分为栈,堆,全局区,文字常量区,程序代码区的。
其实,这些分法只是区分的角度不同,没有对错。个人认为第三种分法比较合适。
5大分区布局
栈(stack): 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
堆(heap): 用于动态分配内存,堆区的数据需要手动释放或程序退出是系统来释放。堆是从低地址向高地址增长,采用链式存储结构。
全局区(静态区): 全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统释放。
文字常量区: 常量字符串就是放在这里的。 程序结束后由系统释放。
程序代码区: 存放函数体的二进制代码。
文字常量区
文字常量区:用来存储字符串常量的区域。当你初始化赋值的时候,这些常量就先在文字常量区开辟一段空间,保存此常量,定义后是不能修改的。以后相同的常量就都在这里了。
我一直疑问char* s = "Hello word"这种属于常量字符串区,那为何不是在栈中或者在全局区呢??
去网上搜了搜,赶脚这篇写很不错,详情请戳
其实,字符串常量按保存区域的不同分为以下几种:
一种是保存在栈区 , char name5[20] = "fengkewei"; 或 char name1[] = "fengkewei";
一种保存在文字常量区, 即 char *name = "fengkewei";
一种保存在全局区(静态区);
一种保存在堆区,即用malloc, alloc, realloc 分配内存分配的区域,可有程序员自身分配和释放。