对我本人来说,学习任何一种高级语言,总想知道高级语言是如何被编译并载入内存的,一个程序的运行,在计算机内存中是怎样组织的等等问题,总想打破砂锅问到底,有好多疑问,因此我就学习了汇编语言,汇编语言确实让你能了解很多底层的东西,它可以直接跟寄存器接触,内存单元接触,自己创建一个栈空间,也可以自己编写安装自己需要的中断例程,让中断向量表相应的入口地址指向自己编写安装的中断例程,让你了解什么是端口,怎样通过汇编指令对这些端口进行读写,让你了解键盘即鼠标的工作原理,自己编写键盘程序等等,确实很有意思,但是汇编有优点,缺点也不少,这里不多说,毕竟主要讲的是C语言。
学习任何东西,都不能了解就好,不能一知半解,毕竟大二全不如小而精,人才都是精通某一领域,在某一领域上作出贡献,更不能没信心,一有难题解决不了,就失去信心,从而放弃,那是绝不可取的,如果这样那么一辈子也做不了什么事。算了,侃这么多跟标题无关的事,请大家原谅,下面正式介绍一下C语言在内存中的组织方式,其实没有过多要讲,但是还是介绍一下吧!
一个可以执行的C程序,一般说来有四个区域组成,哪四个呢?你猜?当然不可能要你猜,猜是猜不着的,那就说出来吧:①、代码段,程序运行时执行的机器指令,何为机器指令,也就是一连串的二进制数,电脑认不得高级语言,必须被编译等阶段转换成二进制机器指令才能被机器所知晓,如if(a>b)…,它也会被编译成机器指令(二进制代码),具体是什么样的机器指令,说实话我也不太清楚。②、静态数据区,包含程序运行周期中一直存在的数据,比如全局变量和静态变量,什么字符串常量啊,等等。③、堆区:程序运行时动态分配的存储空间,一般由程序员分配和释放,比如用malloc、calloc等。堆的分配方式类似于链表(以后会说到),但是它跟数据结构中的堆不是一回事,完了,差点又跑偏了,不说了。④、当然就是堆栈中的栈了,一般由系统自动分配,其包含函数的调用信息,存放函数的参数值,还有就是局部变量的值,操作方式跟数据结构中的栈很类似。
举个类子:
int a; ①
char b; ②
int main(){
int b=10; ③
static int n=2; ④
char c[]={'a','b'}; ⑤
char *p="i love you"; ⑥
int *p=(int *)malloc(sizeof(int)); ⑦
}
上面一段程序①跟②,因为是全局变量,很容易想到它们在静态数据区。③处的数据因为是局部的,所以在栈区,④嘛,因为有static修饰符修饰,静态局部变量故在静态数据区,⑤不要说,也是在栈区,局部字符数组,也是局部变量。⑥有所区别,指针变量p毋庸置疑在栈区,但是后面的i love you是常量字符串,却在静态数据区。指针变量p指向字符串常量。⑦不多说,在堆区。
以上就是关于C程序在内存中组织方式的简要介绍。