C++内存存储区域的划分

C++内存存储区域划分

面试笔试常考

   内存中对数据的存储不是杂乱无章的,而是有相应的划分,根据数据类型分门别类安放到相应的位置。

   存储的区域由最高存储地址到最低存储地址依次为:

  • 命令行参数区:命令行参数和环境变量;
  • 栈区(stack):指那些由编译器需要的时候分配,在不需要的时候自动清除的变量的存储区域。里面的变量通常是函数的参数值、局部变量等值,其操作方式类似于数据结构中的栈。
  • 堆区(heap):动态分配内存。一般由程序员分配释放,若程序员不释放掉,在程序结束后,操作系统可能会自动回收。它与数据结构的堆是两码事,分配方式类似于链表。
  • 数据段:
   全局区(静态区):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全    局变量和未初始化的静态变量在相邻的另一块区域,程序结束后由系统释放。
   文字常量区:常量字符串就是放在这里的。 程序结束后由系统释放。
  • 代码段:存放函数体的二进制代码
//main.cpp 程序代码区
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); //分配得来得10和20字节的区域就在堆区。 
    strcpy(p1, "123456"); //123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。 
}

参考链接:
http://my.oschina.net/hnuweiwei/blog/224346 里面还有java内存分配讲解很赞!
http://developer.51cto.com/art/201104/255220.htm 很详细!

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。