• C/C++程序的存储空间布局


    最近在看《C++primer》和《APUE》,没搞懂这个存储空间布局的问题。

    1.书上说C是分为栈,堆,未初始化数据段(bss段),已初始化数据段(数据段),程序代码区(正文段)。还有在栈和堆之间还加了个内存映射段的。

    2.网上有说C++分区布局是堆、栈、自由存储区、全局/静态存储区和常量存储区的。(其实这种分法少说了一个程序代码区,自由存储区应该属于堆,区别不过是用malloc还是new来进行分配)

    3.还有说分为栈,堆,全局区,文字常量区,程序代码区的。

    其实,这些分法只是区分的角度不同,没有对错。个人认为第三种分法比较合适。

    5大分区布局

    栈(stack): 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 

    堆(heap): 用于动态分配内存,堆区的数据需要手动释放或程序退出是系统来释放。堆是从低地址向高地址增长,采用链式存储结构。

    全局区(静态区): 全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统释放。

    文字常量区: 常量字符串就是放在这里的。 程序结束后由系统释放。

    程序代码区:  存放函数体的二进制代码。

    文字常量区

    文字常量区:用来存储字符串常量的区域。当你初始化赋值的时候,这些常量就先在文字常量区开辟一段空间,保存此常量,定义后是不能修改的。以后相同的常量就都在这里了。

    我一直疑问char* s = "Hello word"这种属于常量字符串区,那为何不是在栈中或者在全局区呢??

    去网上搜了搜,赶脚这篇写很不错,详情请戳http://my.oschina.net/liangtee/blog/109245

    其实,字符串常量按保存区域的不同分为以下几种:

     一种是保存在栈区 , char name5[20] = "fengkewei";  或 char name1[] = "fengkewei";

    一种保存在文字常量区, 即 char *name = "fengkewei";

    一种保存在全局区(静态区);

    一种保存在堆区,即用malloc, alloc, realloc  分配内存分配的区域,可有程序员自身分配和释放。

  • 相关阅读:
    美化WebApi,使其统一返回Json格式
    JavaScript函数封装调用
    Visual Studio 编辑器调试在IIS发布的Web程序出现错误的解决
    C#解析多层Json数据
    Python3解析库lxml
    学习使用Django一 安装虚拟环境
    一:(1.1)了解MVC之路由重写
    Python使用selenium模拟点击,进入下一页(三)
    云服务器安装证书
    Python使用selenium模拟点击(二)
  • 原文地址:https://www.cnblogs.com/beatrice7/p/4126053.html
Copyright © 2020-2023  润新知