c语言进阶
sizeof 指针1.内存管理
a. 未初始化的全局变量(.bss)
b. 初始化的全局变量(.data)
c. 常量数据(.rodata):常量不一定放在.rodata里,有的立即数直接和指令编码在一起,存放在代码段(.text)
d. 代码段(.text)
f. 栈(stack):用于存放临时变量和函数参数。栈向下增长(低地址)。
g. 堆(heap):内存分配了不释放,被称为内存泄漏(Memory Leak)
2.内存分配方式
a.从静态存储区分布:内存在编译时就已经分配好,这块内存在程序的整个运行期间都存在,
如全局变量,static 变量等。
b.在栈上创建:函数内部局部变量,函数执行结束时被释放。
c.在堆上创建:动态内存分配。malloc 和new的时候。要free和delete
3.野指针
a. 指针变量没有被初始化
b. 指针p被free或者delete之后,没有置位NULL
4.指针和数组对比
a. 数组要么在静态存储区被创建,要么在栈上被创建。数组名对应着一块内存(而不是指向),其地址和容量在生命期内保持不变,数组内容可以保持不变
b. 指针可以指向任意类型的内存块。
c. sizeof(a):得到数组真实的大小; sizeof(p):指针变量的字节数
5.预处理
a. 宏定义
b. 文件包含;<>表示在包含文件目录中区查 ""表示首先在当前源文件目录中去查,若未到则去包含目录中去
c. 条件编译
6.函数库的提供形式:静态链接库和动态链接库
a. 静态链接库:
b. 动态链接库:效率更高。不是将库函数的代码直接复制进可执行程序中,只是做个链接标记。当应用程序在内存中执行,运行时环境发现它调用了一个动态库中的库函数时,会加载这个动态库到内存中,以后不管有多少个应用程序在同时使用该库函数,该库函数在内存中只有一份。
7.链接属性
a. 程序从源代码到最终可执行程序:预编译、编译(将源代码翻译成xx.o)、汇编和链接
b. 内存映像:代码段(test)和rodata段;数据段(data)和bss段;堆;文件映射区(进程打开了文件后,将这个文件的内容从硬盘读取到进程的文件映射区,以后就直接在内存中操作这个文件);栈;内核映射区(将操作系统的内核程序映射到这个区域)
8.加载运行代码
a. 单独个人写的C语言程序没法直接在内存中运行,需要一定的外部协助,这段协助的代码叫做加载运行代码,这段代码的主要作用是给全局变量赋值,清bss段(现象:C语言中未初始化的全局变量默认为0)
b. 在裸机下写的代码:定义了一个全局变量初始化为0.但是实际不为0.应在裸机的start.s中加入清bss段代码
9.存储类相关的关键字
auto:修饰局部变量。平时基本省略
static:修饰局部变量,形成静态局部变量;修饰全局变量,形成静态全局变量
register:不常用,修饰变量时,编译器会尽量将他分配到寄存器中,平时变量空间都是分配在内存中。
extern:修饰全局变量
volatile: 这个变量可以被编译器之外(编译器之内:变量值的改变是代码作用的结果;编译器之外:这个改变不是由代码造成的)的改变,编译器在编译当前代码时无法预知。如中断处理程序中isr更改了这个变量的值;多线程中别的线程更改了这个变量的值;硬件自动更改了这个变量的值;
在遇到 volatile 修饰的变量时,就不会对其进行优化,因为这个优化可能会造成错误。
restrict: 用于限定和约束指针:int *restrict p; 所指向的内存单元只能被p所访问,任何同样指向该内存的指针都是无效的。
10.编译以文件为单位,链接以工程为单位。
外链接:所需的函数和变量可以在外部文件中到(跨文件访问)
内链接:所需的函数和变量在文件内部就可以到(static 修饰)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论