首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C语言笔记】C语言编译过程

1、前言 如果你使用是集成开发环境,那么你点击编译按钮就可生成可执行文件,然后点击运行即可运行。那么,你知道从源代码到可执行文件经历了哪些过程吗。仅仅是编译?...下面以windows环境下test.c为例,test.c代码为: #include int main(void) { printf("This is a test program...\n"); return 0; } 其经历如下过程: ? 如图,编译生成可执行文件过程实际包含四个过程:(1)预处理;(2)编译;(3)汇编;(4)链接。...预处理命令为: gcc -E test.c -o test.i 上述命令中-E是让编译器在预处理之后就退出,不进行后续编译过程;-o是指定输出文件名。 预处理之后得到仍然是文本文件。...汇编过程命令为: gcc -c test.s -o test.o 上述命令中-c、-o让汇编器把汇编文件test.s转换成目标文件test.o。

12.1K30
您找到你想要的搜索结果了吗?
是的
没有找到

C语言中内存分布及程序运行加载过程

一个程序内存分配: 下图是APUE中一个典型C内存空间分布图(虚拟内存) 例如: #include int g1=0, g2=0, g3=0; int max(int i) { int m1=...函数调用地址(函数运行代码)(高地址) 而malloc分配堆则存在于这些内存之上,并向上生长 全局变量,静态变量都是在分配内存低部存在(低地址) 程序如何装载 1 编译: 2 编译结果: file...version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=0xd66ac36636c4fcfcbe395efb6bbd38c053e1c6c7...(Linux系统下) 左边是UNIX/LINUX系统执行文件,右边是对应进程逻辑地址空间划分情况。...我理解就是类似mmap函数 直接内存映射 1 ELF文件头 指定加载入口地址 2 加载 代码段 数据段 其他部分 参考 1 Linux内核如何装载和启动一个可执行程序 http://www.cnblogs.com

2K80

C语言编译过程

编译---->形成目标代码,目标代码是在目标机器上运行代码。 连接---->将目标代码C函数库相连接,并将源程序所用代码与目标代码合并,并形成最终可执行二进制机器代码(程序)。...执行----->在特定机器环境下运行C程序。...经过优化得到汇编代码必须经过汇编程序汇编转换成相应机器指令,方可能被机器执行。 4.汇编过程 汇编过程实际上指把汇编语言代码翻译成目标机器指令过程。...对于被翻译系统处理每一个C语言源程序,都将最终经过这一处理而得到相应目标文件。目标文件中所存放也就是与源程序等效目标的机器语言代码。 目标文件由段组成。...经过上述五个过程C源程序就最终被转换成可执行文件了。缺省情况下这个可执行文件名字被命名为a.out。 老九学堂出品

1.9K20

C语言编译过程

代表接下来文本应该被当做包含一个隐式extern "C 块 编译 1.高级语言->汇编代码 命令 gcc -S a.i -o a.s .file "a.c" .globl _...->机器代码 命令gcc -c a.s -o a.o 得到结果是二进制文件。...链接 使用到了C标准库东西“printf”,但是编译过程只是把源文件翻译成二进制而已,这个二进制还不能直接执行,这个时候就需要做一个动作,将翻译成二进制与需要用到库绑定在一块。...函数库一般分为静态库和动态库两种 静态库是指编译链接时,把库文件代码全部加入到可执行文件中,因此生成文件比较大,但在运行时也就不再需要库文件了。其后缀名一般为”.a”。...动态库与之相反,在编译链接时并没有把库文件代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统开销。

1.8K20

1.2 C语言运行原理

为了让大家有个明确学习方向,请大家分享给有需要的人,谢谢! 一、运行原理  作为一种编程语言,本身是谈不上工作原理,实际上C语言所有的语法,正是C语言编译器工作原理或者工作机制具体实现。...要细致讨论起来是不可能,但是作为C语言程序员,必须了解这个大致流程。一个程序,从C语言源码,到系统可执行文件,一般经历四个过程。 ?   ...1、预处理阶断,这个阶断是文本处理阶断,有预处理器来完成,会将源码中带"#"开头预处理命令进行相应处理,在Linux上C语言预处理器程序是cp命令。   ...2、编译阶断,这个阶断是有C语言编译阶断,在Linux上C语言编译器是cc命令,它将C语言源码转换成汇编指令。   ...3、汇编阶断,这个阶断是汇编编译阶断,在Linux上C语言汇编器是as命令,这个阶断会将汇编指令编译成二进制机器码。

2.1K3129

解密C语言编译背后过程

我们大部分程序员可能都是从C语言学起,写过几万行、几十万行、甚至上百万行代码,但是大家是否都清楚C语言编译完整过程呢,如果不清楚的话,我今天就带着大家一起来做个解密吧。...C语言相对于汇编语言是一种高级语言,要想在系统上运行,需要通过编译器把它转换成机器能够读懂可执行代码。...以Linux系统上gcc为例,通常我们编译一个源文件都是用下面的命令: $gcc hello.c –o hello ? 编译成功后,目录里会生成hello这个程序,直接运行它可以看到结果。...$gcc -save-temps hello.c –o hello $ls hello hello.c hello.i hello.o hello.s C编译器编译过程主要分成四步: (1) 预处理...2)编译 Compiling 编译将 hello.i 文件编译生成一个中间文件 hello.s,打开可以看到里边都是汇编语言,所以编译作用就是把源代码转换成汇编语言。 ?

83030

1.3 运行C语言程序步骤

01上机输入和编译源代码  通过键盘向计算机输入程序,如发现有错误,要及时改正。最后将此源程序以文件形式存放在自己指定文件夹内,文件用.c作为后缀。...02对源程序进行编译 先用C编译系统提供“预处理器”对程序 中预处理指令进行编译预处理。在用编译系统对源程序进行编译时,自动包括了预编译和正式编译两个阶段,一气呵成。...03 进行连接处理 经过编译所得到二进制目标文件还不能供计算机直接使用,必须把所有的编译后得到目标模块连接装配起来,再与库函数形成一个整体,生成可执行程序。...04运行可执行程序  一个程序从编写到运行成功,并不是一次成功,往往要经过多次反复。而且即使是编写好程序也并不一定能保证正确无误。 更多案例可以go公众号:C语言入门到精通

2.1K2927

C 语言代码

以下是一个较为复杂 C 语言代码示例,展示了如何使用指针和动态内存分配来实现一个简单字符串操作库: #include #include #include...destroyString(str2); destroyString(concatenated); destroyString(copied); return 0; } 上述代码中...我们实现了以下几个字符串操作函数: createString:用于创建一个新字符串对象,并将字符串内容复制到动态分配内存中。...最后,我们释放了所分配内存,避免内存泄漏。 请注意,这只是一个相对复杂示例代码,演示了如何使用指针和动态内存分配来操作字符串。...在实际编写代码时,应根据具体需求选择合适字符串处理库或者使用已有的标准库函数来处理字符串。

14340

c语言爱心代码详解_C语言程序源代码

1、love图案C语言爱心代码 C语言爱心代码如下: #include int main() { int i, j, k, n = 0, x = 0, y = 50; //爱心头部没有规律...printf("e"); y--; } else break; } printf("\n"); } printf("\n\n\n\n\n\n\n\n\n\n\n\n"); return 0; } 已把大量C语言源码整理为一个压缩包关注微...信 公 众 号:“CC加加” 回复:“源码” 即可获取 效果展示: 2、心形图案C语言爱心代码 代码如下: #include int main() { int i,...中间空格,每下一行空格比上一行少4个 for (m=1; m<=4*i+1; m++) printf("%c", c);//输出右半部分字符小爱心 printf("\n"); //每一行输出完毕换行.../最后空出5行 return 0; } 效果展示: 3、复杂动态C语言爱心代码 代码如下: #include #include #include <windows.h

9.2K20

【数据结构】C语言实现堆(附完整运行代码)

二.项目功能演示(以大堆为例) 要编写一个堆项目,首先要明确我们想要达到效果是什么样,下面我将用vs2022编译器来为大家演示一下堆程序运行样子: 堆程序演示 这是演示过程中程序生成堆数组,我们将数组构建成堆验证一下...注意,该部分代码只是为了详细介绍某一部分项目实现逻辑,故可能会删减一些与该部分不相关代码以便大家理解,需要查看或拷贝完整详细代码朋友可以移步本文第四部分。...【C语言】库宏assert简介及使用方法详解 https://blog.csdn.net/weixin_72357342/article/details/133822893?...php->size = 0; } 四.项目完整代码 我们将程序运行代码分别在三个工程文件中编辑,完整代码如下: test.c文件 #include"Heap.h" int main() {...HP hp; HeapInit(&hp); int swi = 0;//创建变量swi作为do...while循环终止条件,以及switch语句运行条件 do

5910

C语言代码封装MQTT协议报文,了解MQTT协议通信过程

固定报头格式是统一,其中包括了报文类型和剩余长度两个字段。 可变报头格式取决于报文类型。 下面是MQTT协议中各个报文类型可变报头字段说明。...其中,固定报头第一个字节(即报文类型和标志位组合)为0x10,表示这是一个CONNECT报文。...可变报头包括了以下字段: 协议名(Protocol Name):用于标识MQTT协议名称,固定为字符串"MQTT"; 协议级别(Protocol Level):用于标识所使用MQTT协议版本号,一般情况下为...【3】封装MQTT协议 这是一个使用C语言在Linux下建立TCP通信并发送MQTT报文例子。 根据MQTT报文自己封装协议。...unsigned int length = 0; // 固定报头 data[length++] = MQTT_CONNECT; // 可变报头 data[length++] = 0x0C;

1.3K20

C 语言代码示例

以下是一个较为复杂 C 语言代码示例,它演示了如何使用链表数据结构实现一个简单图(Graph)数据结构,并实现图深度优先搜索(DFS)算法: #include #include...visited[i] = 0; } printf("深度优先搜索结果:"); DFS(graph, 0, visited); return 0; } 上述代码实现了一个使用链表数据结构表示简单无向图...(undirected graph)数据结构,并展示了如何实现图深度优先搜索(DFS)算法。...在 main 函数中,我们创建了一个包含 6 个顶点图,并添加了边连接这些顶点。然后,我们使用深度优先搜索来遍历这个图,并打印出遍历结果。...请注意,这个例子对于初学者可能具有一定复杂度,涉及到动态内存分配和链表数据结构操作。实际编程中,根据需求选择适当数据结构和算法是非常重要

13720

C#-VsCode如何运行C#代码

浏览量 1 VsCode作为一款优秀代码编辑器,有调试代码功能,我们必须要来玩一玩这个,这里就以运行c#代码为例子,简单说一下吧。...这是开发人员最可能获取包。 它包含下列组件: .NET Core 命令行工具,用于生成应用程序。 .NET Core(库和运行时),用于生成并运行应用程序。...dotnet 驱动程序,用于运行 CLI 命令和应用程序。 安装VsCode C#调试器扩展 你可以直接在VS Code编辑器里面搜索到,你也可以去VsCode插件网站上下载,安装。...,其实就是里面dll那个路径。...运行 配置完成之后就可以运行程序了,可以看到在调试输出地方打印出了”hello world!”,这样就完成了。

1.9K10
领券