首先.c文件预编译成为.i文件(预编译文件),然后.i文件被编译成.obj文件,然后再经过链接(多个.c被链接,.h文件并不被链接),成为.exe文件(两部分,代码和数据:全局变量,静态变量等)储存在磁盘中
然后当这个.exe文件被执行时,cpu它中的代码被加载到内存中,(因为磁盘与cpu的运行速度相差太大,相差20万倍,内存和cpu相差200倍,cpu内的寄存器与cpu速度大致相同,寄存器与1级级缓冲区大概有4倍差距,与2级缓冲区大概有8倍差距,与3级缓冲区大概有10倍差距,和内存差200倍)
然后内存为它开辟四个空间,代码区,数据区,堆区,栈区。
代码以二进制形式存储在代码区,当执行到一个函数时,在栈区为这个函数申请栈帧(大概88字节),而函数中的形参变量等在这个栈帧中被分配空间,所以这个变量也被称为局部变量。栈区在函数执行完之后会被自动释放,而其中为变量所分配的空间也会被释放,所以它的生存期从函数开始到函数结束,
全局变量,静态变量等储存在数据区,数据区只有在程序全部执行完之后才会被释放,所以它们的生存期是程序开始到程序接受。当static修饰局部变量时,它只能在定义的该函数内使用。
我们可以malloc在堆中申请空间,这个空间需要程序员手动free释放。在一个函数中,执行一个函数,则会在调用函数的位置设置一个中断,让函数执行完之后返回到这里继续执行。而有返回值的函数,在执行完之后,则会通过寄存器,把这个值带回主函数中。
在window 中,栈的空间大概是1MB,在Linux中,栈的空间大概是10MB ,而堆的话大概是4G.