Linux整理笔记(4)

一、常量数据

1)常量不一定放在rodata里,有的立即直接和指令编码在一起,存放在代码段中。

2)对于字符串常量,编译器 会自动去掉重复的字符串,保证一个字符串在一个可执行文件中存在一份复制。

3rodata是在多个进程间是共享的,这样可以提高运行空间利用率。

4rodata放在ROM中,运行直接读取,无需加载到RAM内存中。

5)在嵌入式系统中,也可以通过一种叫做XIP的技术,也可以直接读取,而无需加载到RAM内存中。

6)常量是不能修改的,修改常量在Linux下会出现段错误。

二、内存分配方式

1)从静态存储区域分配。内存在程序编译时就已经分配好,这块内存在程序的整个运行期间都存在,如全局变量、static变量。

2)在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算使用内至于处理器的指令集,效率很高,但分配的内存容量有限。

3)从堆上分配,亦称动态内存分配,程序在运行时用mallocnew申请所需要的内存,程序员自己负责在何时用freedelete释放内存。动态内存的生存期有程序员决定,使用非常灵活,但问题也最大。

三、野指针的的成因

1)指针变量没有被初始化。任何指针变量改那个被创建不会自动成为NULL 指针,他的默认值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。

2)指针pfree或者delete之后,没有置为NULL,让人误以为p是个合法的指针。别看freedelete的名字,它们知识把指针所指向的内存给释放掉,但并没有把指针本身干掉。

四、常见的内存错误

1)内存分配未成功,但使用了它。

2)内存分配虽然成功,但是尚未初始化就引用它。

3)内存分配成功并且已经初始化,但操作越过了内存的边界。

4)忘记了释放内存,造成内存泄漏。

5)释放了内存却继续使用它。

五、段错误

简而言之,产生段错误就是访问了错误的内存段。

一般来说,段错误就是值访问的内存超出了系统所给这个程序的内存空间,通常这个值是由gdtr来保存的,它是一个48位的寄存器,其中的32位用于保存由它指向的gtd表;后13位用于保存相应于gdt的下标;最后3位包括了程序是否在内存中,以及程序在CPU中的运行级别。

六、指针和数组

数组要么在静态存储区被创建,要么在栈上被创建。数组怒不敢对应着一块内存,其地址与容量在生命周期内保持不变,只有数组的内存可以改变。

指针可以随时指向任意类型的内存块,它的特征是“可变”,所以常用指针来操作动态内存。指针远比数组灵活,但也更危险。

七、宏定义

宏定义是用宏名来表示一个字符串,在宏展开时又以该字符串取代宏名,这知识一种简单的代替,字符串中可以含任何字符,可以是常数,也可以是表达式。

宏定义不是说明或语句,在行末不必加分号,如加上分号则连分号也一起置换。宏定义必须写在函数之外,其作用域为宏定义命令起到源程序结束。如果要终止其作用域可以使用#undef”命令。

八、文件包含

把指定的文件和当前的源程序文件连成一个源文件。在程序设计中,文件包含是很有用的。一个大的程序可以分为多个模块,由多个程序员分别编程。有些公用的符号常量或宏定义等可单独组成一个文件,在其他文件的开头用包含命令包含该文件即可使用。这样可避免在每个文件开头都去书写哪些公用量,从而减少时间,并减少出错。

九、结构体和联合体的区别

structunion都是由多个不同的数据类型成员组成的,但在任何同一时刻,union中只存放了一个被选中的成员,而struct的所有成员都存在。在struct中,各成员都占有自己的内存空间,它们是同时存在的,一个struct变量的总长度等于所有成员长度之和;在union中,所有成员不能同时占用它的内存空间,它们不能同时存在,union变量的长度等于最长的成员的长度。

十、C语言中的位段

段位是以单位来定义结构体中的成员变量所占的空间,含有段位的结构体称为位段结构,采用位段结构既能节省空间,又方便操作。位段的类型只能是intunsigned intsigned int 三种类型,不能是char型或浮点型。对位段赋值是,最好不要超过位段所能表示的最大范围,否则可能会造成意想不到的结果。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值