内存中的5个区域:堆、栈、静态区,代码区

一个程序的运行起来后,其在内存中有5个区域
1. 程序代码区
这个很简单,代码要执行,肯定要加载进内存, 我们不必关心。
 
2. 文字常量区
一般我们这样定义一个字符串时,其是在文字常量区的:
char* s1 = "hello, world";
char* s2 = "hello, world";
if(s1 == s2)
    printf("s1和s2指向同一个在文字常量区的字符串");
 
这里, s1和s2指向的是同一个字符串
 
3. 静态存储区(不会释放,只到程序结束
全局变量,静态变量会放在这个区域,事实上,全局变量也是静态的。
 
以上1,2,3三个区域的内存在程序起来的时候就开辟好了的。
 
4. 栈(}结束被自动释放)
局部变量就是在栈里的。另外,函数调用时的参数也是在栈里的,这个现在不必关心
 
5. 堆(没有被手动销毁,他一直存在,直到程序结束.  
malloc或new出来的内存就是在堆里的,需要程序员自己管理清除。
 
 
 
 
//1.栈区:特性先进后出(后进先出)  
  //栈的特性  
  /* 
  int a=10;//1 
  int b=10;//2 
  int c=10;//3 
  //创建顺序:123 
  //销毁顺序:321 
  //每一个函数都有一个栈帧 
   
  test(); 
  int f=10; 
  */  
    
  //函数中的变量一旦函数执行完成.全部被销毁.  
  /* 
  char *p=test2(); 
  printf("%s",p); 
   
  */  
    
    
  //2.堆区:程序员手动分配的内存,并且需要程序员手动销毁.(有几个专门的内存函数) 特点:一旦分配不管在什么地方.没有被手动销毁,他一直存在,直到程序结束.  
    
  //3.常量区:我们编写的程序种所有的常量都被放在常量区,直到程序结束为止  
  //4.静态区:1.全局变量.(所有大括号外边的变量).2.static标注的变量;  
 /* 
  for (int i=0; i<3; i++) { 
      static int count =0;//这句话只执行一次 
      //被static标注的变量会有一个初始值0; 
      count++; 
      printf("%d",count); 
 
  } 
  //5.代码区:我们编写的代码被编译器翻译之后,存入代码区 
  
  //malloc堆内存分配 
  //按照字节分配 
  //分配好的空间,使用什么类型的指针指向它,它就是什么类型的. 
/* 
  int *p=malloc(4); 
  *p=10; 
  printf("%d",*p); 
  */  
  /*  
  charchar *s=malloc(100);  
    
  strcpy(s, "大家好,我很     
 
posted @ 2018-01-25 23:57  gaogaihui  阅读(2868)  评论(0编辑  收藏  举报