内存四区
突然想起来之前有同学问我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 }
这次先将栈区说明一下,其他区先不说,不然总感觉有些乱。