内存四区

Posted SmartGame

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了内存四区相关的知识,希望对你有一定的参考价值。

  突然想起来之前有同学问我C语言里关于指针的问题,虽然解释的半天,但是仍感觉对方似懂非懂,于是想起去年我老师教我时,是让我先搞清内存四区,再对我讲解有关指针方面的问题,于是就想着把自己的见解在这里写下来。

  内存四区

  1.栈区(俗称内存又称cpu)
  将地址调入之后,cpu开始运行这个地址的程序,类似于鼠标双击图标,就是将地址写入cpu
  2.全局区
  例如在主函数中定义的变量可在子函数中调用(可称为全局变量),但子函数中定义的变量不可以在主函数中调用,除非是子函数将内存地址指向全局区可在主函数中调用,静态区static;

  3.堆区
  由程序员分配释放 若程序员不释放,则在程序结束后自动释放。

  4.代码区
  存放代码的地方。二进制代码

  理论想来大家也是看烂了,但是还是要复习的。曾经有人对我说:“概念不清晰是产生bug的根源!我也很赞同这句话,不过有时候我对概念也是似懂非懂的。废话不说上代码:

 

  #include <stdio.h>

  #include <string.h>

  #include <stdlib.h> 

  void distribution(int a,int b)

{

  int c = 0;//函数中的c也在栈区分配内存

  c = a + b+ x

  printf("%d\n",c);

}

  char *distributio()

{

  char *c = (char *)malloc(sizeof(char)*64);//在堆区分配内存空间

  if( c != NULL)//判断是否成功分配内存

  {

    return c;//如果成功分配,则将地址传递出去

  }

  return NULL;

}

  int main()

{

  int  a = 0;// 此时整型变量a开始入栈,编译器为其在栈区分配内存//说明:并不是为a分配内存,只是分配了四个字节的内存块,然后编译a 时可以通过a找到这块内存的地址,

//说简单点就是 0 这个数字是存入了栈区所分配的这个内存块里,而不是变量a里面,变量a是无法存取数据的,它只是相当于一个门牌号的作用,供编译器找到内存地址。

  int  b = 1;//变量b紧随变量a入栈,同上理。

  char *c = NULL;

  distribution(a,b);//此时函数开始入栈

  //当运行到这一步是distirbution() 已经被 析构 掉了 防止其占用空间 浪费了资源

  c = distribution2();//在子函数中 在堆区分配了内存空间,子函数被析构掉时,堆区的空间不会被析构,(由程序员自己释放)

  system("pause");

  return 0;

}

 

  这次先将栈区说明一下,其他区先不说,不然总感觉有些乱。

 

以上是关于内存四区的主要内容,如果未能解决你的问题,请参考以下文章

内存四区模型

内存四区

内存四区

内存四区说明

C语言内存四区

C语言:内存四区