内存四区

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

  内存四区

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

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

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

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

 1 #include <stdio.h>
 2 
 3   #include <string.h>
 4 
 5   #include <stdlib.h> 
 6 
 7   void distribution(int a,int b)
 8 
 9 {
10 
11   int c = 0;//函数中的c也在栈区分配内存
12 
13   c = a + b+ x
14 
15   printf("%d\n",c);
16 
17 }
18 
19   char *distributio()
20 
21 {
22 
23   char *c = (char *)malloc(sizeof(char)*64);//在堆区分配内存空间
24 
25   if( c != NULL)//判断是否成功分配内存
26 
27   {
28 
29     return c;//如果成功分配,则将地址传递出去
30 
31   }
32 
33   return NULL;
34 
35 }
36 
37   int main()
38 
39 {
40 
41   int  a = 0;// 此时整型变量a开始入栈,编译器为其在栈区分配内存//说明:并不是为a分配内存,只是分配了四个字节的内存块,然后编译a 时可以通过a找到这块内存的地址,
42 
43 //说简单点就是 0 这个数字是存入了栈区所分配的这个内存块里,而不是变量a里面,变量a是无法存取数据的,它只是相当于一个门牌号的作用,供编译器找到内存地址。
44 
45   int  b = 1;//变量b紧随变量a入栈,同上理。
46 
47   char *c = NULL;
48 
49   distribution(a,b);//此时函数开始入栈
50 
51   //当运行到这一步是distirbution() 已经被 析构 掉了 防止其占用空间 浪费了资源
52 
53   c = distribution2();//在子函数中 在堆区分配了内存空间,子函数被析构掉时,堆区的空间不会被析构,(由程序员自己释放)
54 
55   system("pause");
56 
57   return 0;
58 
59 }

 

 

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

 

posted @ 2017-09-16 23:26  SmartGame  阅读(354)  评论(0编辑  收藏  举报