标题:那一抹绿色
想来大多数学习C语言的人都是从谭浩强教授那本绿色封面的《C语言程序设计》入门的,我也是其中之一。记得那是在大学入学前,我在泉州九一街十字路口的晓风书屋(后来为风雅颂)买下了那本书。
命运的手掌轻轻一抚,就突如其来地使得我选择了计算机专业,这是我所始料不及的。虽然计算机也是我的兴趣,虽然高中时代在家还会津津有味地对着《黑客X档案》或者《电脑爱好者》的VB教程敲个QQ盗号程序或者趣味小程序,但是我从来没有想过会去读计算机专业,现在看来倒真有点不能理解为何如此。不过细细想来,一个不可忽视的原因可能会是相较于划拉VB界面,我有更多的时候是在看比如今何在的《悟空传》,然后为封面的那几句话振奋不已,为里面的爱情故事揪心不已,比如余秋雨的《千年一叹》,然后因为耶路撒冷那座挂着许多天真儿童画像的大屠杀纪念馆难过不止,又比如《三国演义》,比如《史记》……
虽然理工科更偏向的是逻辑的严密性,但命运手掌的指缝间难免遗漏点伤春悲秋的细屑,比如现在。不过却不会再一发不可收拾。
如果一味地搞文学气息,想必我都可以改行去尝试做个诗人或者作家了,而不必在此整理回顾我所学过的计算机知识了。
----------------------------------------cuttingline----------------------------------------
那么,回到学术问题上,以一段简单的代码开始这段旅程:
#include <stdio.h> /* *Jason Lee *良好的多行注释风格 *一般用于程序说明或者函数说明 */ void colorGreen(){ printf("那一抹绿色/n");//单行注释 } int main(int argc, char *argv[]){ colorGreen(); printf("%d/n",argc); printf("%s/n",argv[0]); return 0; }
以上代码是典型的C程序结构,其中值得提的有两个地方:一是开始的多行注释,现在编写程序应尽量使用良好的注释风格和命名习惯;二是主函数的两个参数,分表代表系统调用程序时给的参数个数和参数列表,默认有一个参数argv[0],即程序本身。
那么,这个程序的运行过程是如何的呢?当然,我指的是在内存中执行的某方面。
操作系统使用栈式、堆式两种内存分配方法,而在管理函数调用方面采取的是栈式分配策略。堆和栈是朝着对方进行扩展的,栈向下扩伸,而堆相反。
首先自然是main函数得到调用,它在栈中获得了一片存储区域,称为活动记录,里面保存着该函数的变量、参数等信息,在此不妨将之称为main活动记录。紧接着main函数调用colorGreen函数,同样的,colorGreen也在栈中建立了一个活动记录,并且紧接在main活动记录下方。系统总是对栈顶的活动记录进行操作,当然不总是成功,在这里我们假设操作成功,于是系统执行colorGreen结束后将栈顶元素出栈,继续操作栈顶元素,此时就是main活动记录了。
main活动记录 |
colorGreen活动记录 |
不妨增加一个colorRed函数,功能类似colorGreen,并且将之放置在main函数中紧接colorGreen之后,即调用colorGreen后马上调用colorRed。这时候的活动记录存活顺序是:main活动记录进栈,colorGreen活动记录进栈,colorGreen活动记录出栈,colorRed活动记录进栈,colorRed活动记录出栈,继而继续执行main函数。如果我们将之看做树的形式,即main函数的左儿子是colorGreen,右儿子是colorRed,可以看出是一个后序遍历的过程。并且可以知道,某结点的左兄弟(如果有的话)总是先于该结点消亡,沿该结点往上直达树根对应了栈中最底层的活动记录往上直到main函数。
2010-1-24
晚
----------------------------------------cuttingline----------------------------------------