04c语言——内存四区与程序运行的四个步骤

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

一、内存四区

一个程序在运行的时候,操作系统会为程序分配一个4g的内存空间,分别为4个部分——堆、栈、代码区、全局区。
编译器将代码从硬盘下载到内存,将内存划分为4个区域,由操作系统找到main函数入口开始执行程序。
1.栈
存放局部变量(函数形参也是局部变量),由编译器申请释放,函数运行时申请,函数执行结束释放。
2.堆
由程序员手动申请,手动释放,如果程序员在程序结束之前没有进行释放,在程序结束后操作系统会回收。注意在使用malloc函数在free时,要将指针至为NULL,因为free的本质是告诉编译器之前申请的这一片内存区域不再使用,但是之前指针的指向并没有改变,因此至为空才代表完全释放。
3.全局区
全局变量和静态变量:全局变量个静态变量存放在一个地方,初始化的全局变量和静态变量在一个区域,未初始化的全局变量和静态变量在一个区域。该区域在程序结束之后由操作系统回收。
常量区:存放字符串常量区和其他常量,程序结束后操作系统回收。
4.代码区
存放代码,即函数体的二进制代码。

在这里插入图片描述

局部变量与变量变量区别

项目全局变量局部变量
定义函数体外函数体内
存储位置数据区栈区
初值0随机值
空间开辟在编译的时候开辟空间代码运行至定义处开辟空间

二、程序运行的四个步骤

1.预处理

作用是:
(1)文件包含#include “head.h”
(2)删除代码注释的部分
(3)宏定义的替换(字符串的替换)
(4)条件编译:#if 0-----#endif 或者#ifndef----#define------#endif

执行的命令为:
gcc hello.c -E -o hello.i
gcc -E生成后缀名为.i的文件

2.编译

作用是:
(1)将c代码转换为汇编代码
(2)检查语法错误

执行的命令为:
gcc hello.c -S -o hello.s
gcc -S生成后缀名为.s的文件

3.汇编

作用是:将汇编代码转换为机器能识别的2进制机器指令。

执行的命令为:
gcc hello.c -c -o hello.o
gcc -c生成后缀名为.o的文件

4.链接

分为静态链接和动态链接

(1)静态链接是由链接器在链接时将库的内容加入到可执行程序中的做法。链接器是一个独立程序,将一个或多个库或目标文件(先前由编译器或汇编器生成)链接到一块生成可执行程序。
静态链接是指把要调用的函数或者过程链接到可执行文件中,成为可执行文件的一部分。

(2)动态链接所调用的函数代码并没有被拷贝到应用程序的可执行文件中去,而是仅仅在其中加入了所调用函数的描述信息(往往是一些重定位信息)。仅当应用程序被装入内存开始运行时,在Windows的管理下,才在应用程序与相应的DLL之间建立链接关系。当要执行所调用DLL中的函数时,根据链接产生的重定位信息,Windows才转去执行DLL中相应的函数代码。

作用是:代码执行到这一步还不能直接运行,它所需要库还没有加载进来,加载代码所需要的库。

执行的命令为:
gcc hello.c 
gcc 生成后缀名为.c的文件可执行程序

5.动态库和静态库

	静态库:
		lib库名.a
		libjpeg.a
	动态库:
		lib库名.so
		libjpeg.so
	动态库和静态库的区别:
	1.静态库是编译时加载
	2.动态库时执行的时候加载
	3.静态库时链接到代码后,库丢失,程序依然能够执行
	4.动态库链接到代码代码后,库丢,程序不能运行
	5.静态库会使代码体积增大
	6. 多个程序编译加载多个静态库
	7.动态库不会代码体积增大
	8.多个文件使用一个动态库
	

6.动态库和静态库制作

	静态库
	1.编写功能函数(不能加入main函数)
	2.编写功能函数的头文件
	3.gcc -c filename -o filename.o
	4.ar crs libfilename.a filename.o
	5.编写程序调用实现库中功能函数
	6.gcc main.c -lfilename -L

7.动态库制作

	动态库
	1.编写功能函数(不能加入main函数)
	2.编写功能函数的头文件
	3.gcc -c filename -o filename.o
	4.gcc -fPIC -shared filename.o -o libfilename.so
	5.将libfilename.so 拷贝到/user/lib下面
		sudo cp libfilename.so /usr/lib
	6.编写程序调用库中功能函数
	7.gcc main.c -lfilename

总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

  • 10
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值