变量,函数内存分布---虚拟地址空间布局

    int a = 10;        //全局变量,全局区。  全局变量初始化且初始化不为0,存放在内存的.data段   

    int m;     //  全局变量初始化为0或者未初始化,存放在.bss段
    class SomeClass
    {
    private:
        int b;    //由使用决定,在main函数中类SomeClass动态分配,因此在堆区。
        static int c;    //静态成员在全局区。
    };
    
    int main()
    {
        int d = 0;    //栈区。
        SomeClass *p = new SomeClass;    //栈区。
        return 0;
    }

                                                  内存空间分布图

 

内存分区 说明
程序代码区(code area) 存放函数体(类成员函数和全局函数)的二进制代码
静态数据区(data area)
  • 全局变量和静态变量的存储是放在一块的
  1. (.data)初始化的全局变量和静态变量在一块区域 
  2. (.bss)未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。
  • 常量数据(一般常量、字符串常量)存放在另一个区域。常量字符串就是放在这里的。程序结束后由系统释放。

注意: 未初始化的全局变量的默认值是 0,而未初始化的局部变量的值却是垃圾值(任意值)。 

            静态数据区的内存在程序结束后由操作系统释放。

堆区(heap area)

一般由程序员分配和释放,若程序员不释放,程序运行结束时由操作系统回收。malloc()calloc()free() 等函数操作的就是这块内存

栈区(stack area) 由系统自动分配释放,存放为运行函数而分配的局部变量、函数参数、返回数据、返回地址等。其操作方式类似于数据结构中的栈。
命令行参数区 存放命令行参数和环境变量的值,如通过main()函数传递的值。

提示:关于局部的字符串常量是存放在全局的常量区还是栈区,不同的编译器有不同的实现,VC 将局部常量像局部变量一样对待,存储于栈(⑥区)中,TC则存储在静态数据区的常量区(②区)

                                                       内存模型示意图

#include<stdio.h>   
#include<stdlib.h>    
#include<string.h>    
int a = 0;  // 全局初始化区(④区)    
char *p1;  // 全局未初始化区(③区)    
int main()    
{        
	int b;  // 栈区        
	char s[] = "abc";  // 栈区        
	char *p2;  // 栈区        
	char *p3 = "123456"; // 
	123456\0 在常量区(②),p3在栈上,体会与 char s[]="abc"; 的不同        
	static int c = 0;  // 全局初始化区        
	p1 = (char *)malloc(10),  // 堆区        
	p2 = (char *)malloc(20);  // 堆区       
	// 123456\0 放在常量区,但编译器可能会将它与p3所指向的"123456"优化成一个地方        
	strcpy(p1, "123456");   
}

栈和堆的区别:

  1. 栈内存是由系统分配,系统释放的;以函数为单位进行栈内存分配,函数栈帧,局 部变量,形参变量等都存放在栈内存上。堆内存是由用户自己分配的,C 语言用 malloc/free 进行分配释放,C++用 new/delete 进行分配释放,由于堆需要用户自己管理,因此堆内存 很容易造成内存泄露,而栈内存不会。
  2. 栈的内存分配释放速度快效率高,内存都是连续的;堆内存的分配释放相对于栈来 说效率低一些,内存不一定连续,容易产生内存碎片,但是灵活性高。
  3. 栈是由高地址向低地址扩展的连续内存,栈的大小一般为 2M 或者 10M(大家的 redhat 系统可以用 ulimit -s 命令来查看,是 10M);堆是由低地址向高地址扩展的非连续内 存,堆的大小影响的因素比较多,和系统虚拟内存的大小有关系。

看到其他总结的比较好的博客

https://blog.csdn.net/qq_21842557/article/details/50777199

http://blog.csdn.net/FreeeLinux/article/details/53782986 

https://blog.csdn.net/do2jiang/article/details/4690967  

http://blog.csdn.net/FreeeLinux/article/details/53782986 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章