关于栈的析构问题
关于栈这个问题我自己理解的比较抽象,其实我之前也写过,在C中我们可以把栈区看成是cpu,下面我将它与操作系统的部分理论结合起来讲解好了,倘若我们把每个模块(即函数)看成是就绪状态,也就是说,我们写出代码就是已经准备运行的状态,但是倘若我们不进行编译的话,也就是说不给它分配内存空间(cpu),这样的话,是不会产生结果的。
当我们点击编译时,开始往cpu中导入数据也就是开始分配资源,要注意的是导入的数据并不是我们写的代码,而是我们通过代码所操纵内存空间的操作,也就是对于资源的操作,正如同当我们生成.exe文件后可以直接运行,然后这个时候的程序可以称为进程了,然后就有了进程控制块PCB,可以理解为每个进程运行时都分配了内存空间(资源),然后通过PCB来控制这些资源,也就是说一个进程运行完了之后我们不再使用它了,如果不释放它,它就会一直占用资源,造成了资源浪费,这对于一些大型工程来说是很要命的;所以在进程运行完了之后,要进行资源释放,栈的释放(析构)就是这个原理(大概是这样吧!);
其实这正如同我们平时点击应用图标一样,这个应用图标就是一个接口,然后把应用所需资源导入cpu;
然后我们的问题就来了,栈的析构到底是什么样的,其实在前面我已经说过了,所以这里我稍微说的详细一点;
1 #include2 #include <string.h> 3 #include 4 5 void CiteConstants(int a);//形参为普通常量 6 7 void CitePointer(int *a);//形参为指针 8 9 void main() 10 { 11 int a = 0; 12 13 CiteConstants(a); 14 printf("main:%d\n",a); 15 CitePointer(&a); 16 printf("main:%d\n",a); 17 18 system("pause"); 19 return ; 20 } 21 22 void CiteConstants(int a)//形参为普通常量 23 { 24 a = 10;//改变a的值不会改变main函数中啊 25 printf("CiteConstants:%d\n",a); 26 } 27 28 void CitePointer(int *a)//形参为指针 29 { 30 *a = 12; 31 }
在这里我们可以看见,当我们调用一个函数时会新开辟一个不同于main函数的栈区,也就是他们是不相干的两块空间了,也就是说无法通过普通变量改变main里的值,但是指针却可以,因为指针里储存的是地址,它直接操作main函数里的内存空间;
通过上面的图我们可以看出来由函数所分配的栈空间,就像基础数据类型一样分配的内存空间,那么也就是说这个栈是有首地址的,说到这里估计都明白了,函数体其实也是一种数据类型,而函数名就是找到这个地址的接口,或者说门牌号。
那么这么一来,我们就引出了函数指针,因为既然它有地址,自然就可以用一个指针来指向它了,然后通过指针来操作它的内存空间,所以说绕到了最后,还是地址,或者说指针的问题;
其实这析构一点在C++中的析构函数中可以充分的体现出来,以后要是写C++的话我会再详细写的;
至于函数体括号里的参数,它们其实和写在函数体里面是一样的,只不过是有对外的属性(即可以通过外界资源改变参数的值),也就是说函数体被析构是,他们会一同被析构掉;