c程序的执行需要经过预处理、编译、汇编、链接四个步骤,这些步骤都是由编译器帮我们执行的,那么,一段程序在被编译器编译后在内存中是以什么方式存在的呢?
简单的说,c程序在编译完后分成代码区和数据区。
代码区存放着程序的指令,也就是函数体的二进制码。代码区有只读和共享两个特点,其中只读是防止在代码执行过程中被修改了,共享则是为了让每次调用这段程序都能直接使用,减少内存损耗。
数据区可以分为data区(初始化的数据区)和bss区(未初始化的数据区)。
其中,data区存放着全局变量、静态变量以及字符串常量和const修饰的全局变量。
bss区存放的是未初始化的数据,例如定义了一个整型变量 int a;没有给定初始值的情况下,会被初始化为0或null,存放在bss区中,直到在程序执行时被初始化。
注意:栈区和堆区是在程序执行时才产生的。
栈区是一种先进后出的数据结构,由编译器自动分配释放,用于存放函数的参数值、返回值和局部变量等,由编译器实时分配和释放。因此,局部变量的声明周期就是从函数执行到函数执行完毕这一段过程。
堆区不像栈区一样,它没有先进后出的特点,内存远大于栈区,是动态的内存空间,由程序员分配和释放,在程序结束时,若程序员没有释放,则由系统释放。关键词为malloc(申请内存)和free(释放内存)。