zoukankan      html  css  js  c++  java
  • 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  分配内存分配的区域,可有程序员自身分配和释放。

  • 相关阅读:
    1052 Linked List Sorting (25 分)
    1051 Pop Sequence (25 分)
    1050 String Subtraction (20 分)
    1049 Counting Ones (30 分)
    1048 Find Coins (25 分)
    1047 Student List for Course (25 分)
    1046 Shortest Distance (20 分)
    1045 Favorite Color Stripe (30 分)
    1044 Shopping in Mars (25 分)
    1055 The World's Richest (25 分)
  • 原文地址:https://www.cnblogs.com/beatrice7/p/4126053.html
Copyright © 2011-2022 走看看