1、从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。
2、在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
3、从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由程序员决定,使用非常灵活,但如果在堆上分配了空间,就有责任回收它,否则运行的程序会出现内存泄漏,频繁地分配和释放不同大小的堆空间将会产生堆内碎块。
开发一个C语言程序需要经过的四个步骤:编辑、编译、连接、运行。
C语言程序可以使用在任意架构的处理器上,只要那种架构的处理器具有对应的C语言编译器和库,然后将C源代码编译、连接成目标二进制文件之后即可运行。
1、预处理:输入源程序并保存(.C文件)。
2、编译:将源程序翻译为目标文件(.OBJ文件)。
3、链接:将目标文件生成可执行文件( .EXE文件)。
4、运行:执行.EXE文件,得到运行结果。
扩展资料:
C语言代码变为程序的几个阶段:
1、首先是源代码文件test.c和相关的头文件,如stdio.h等被预处理器cpp预处理成一个.i文件。经过预编译后的.i文件不包含任何宏定义,因为所有的宏已经被展开,并且包含的文件也已经被插入到.i文件中。
2、编译过程就是把预处理完的文件进行一系列的词法分析、语法分析、语义分析以及优化后产生相应的汇编代码文件,这个过程往往是我们所说的整个程序的构建的核心部分,也是最复杂的部分之一。
3、汇编器不直接输出可执行文件而是输出一个目标文件,汇编器可以调用ld产生一个能够运行的可执行程序。即需要将一大堆文件链接起来才可以得到“a.out”,即最终的可执行文件。
4、在链接过程中,对其他定义在目标文件中的函数调用的指令需要被重新调整,对实用其他定义在其他目标文件的变量来说,也存在同样问题。
参考资料来源:百度百科-c语言
c语言运行方式如下:上机输入和编译源程序。通过键盘向计算机输入程序,最后将此源程序以文件形式存放在文件夹内,文件用.c作为后缀,生成源程序文件。对源程序进行编译,先用c编译系统提供的“预处理器”对程序中的预处理指令进行编译预处理。例如,对于#include指令来说,就是将stdio.h头文件的内容读进来,取代#include行。由预处理得到的信息与程序其他部分一起组成一个完整的、可以用来正式编译的源程序,然后由编译系统对该源程序进行编译。
编译的作用是对源程序进行检查,判定程序有无语法的错误。直到没有错误时,编译程序自动把源程序转换为二进制形式的目标程序进行连接处理。经过编译后所得到的二进制目标文件还不能供计算机直接执行。一个程序可能包含若干个源程序文件,而一次编译只能得到与一个源程序文件相对应的目标文件,
只是程序的一部分,必须把所有编译后得到的目标文件链接装配起来,再与函数库相连接成一个整体,生成一个可供计算机执行的目标程序,称为可执行程序,即使一个程序只包含一个源文件,编译后得到的目标程序也不能直接运行,也要经过连接阶段,因为要和函数库进行连接,才能生成可执行程序。运行可执行程序,得到运行结果。把f.exe输入计算机,并使之运行,得到结果。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)