突然想起来之前有同学问我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;
}
这次先将栈区说明一下,其他区先不说,不然总感觉有些乱。
原文:http://www.cnblogs.com/huhaihao/p/7533254.html