标题:那一抹绿色
想来大多数学习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----------------------------------------