1.未初始化的全局变量(.bss段)和初始过的全局变量(.data)的区别?
bss类型的全局变量只占运行时的内存空间,而不占文件空间;data段用来存放那些初始化为非零的全局变量,既占文件空间,又占运行空间。在整个程序的运行周期内,data数据是一直存在的。
2.常量数据(.rodata)的问题?
常量不一定就放在rodata里,有的立即数直接和指令编码在一起,存放在代码段(.text)中。
字符串会被编译器自动放到rodata中,其他数据要放到rodata中,只要加const关键字就修饰好了。
3.栈(stack)的作用?
用来存放临时变量和函数参数。可以用来实现函数的调用。
4.堆
malloc:用来分配一块指定大小的内存
realloc:用来调整/重分配一块存在的内存
free:用来释放不在使用的内存
5.使用堆内存的注意点
·malloc/free要配对使用
·每个区间都有四个属性
6.野指针的成因?
·指针变量没有初始化
·指针p被free或delete之后,没有置为NULL,让人误以为p是个合法的指针
7.常见的内存错误
(1)内存分配未成功,却使用了它
(2)内存分配虽然成功,但尚未初始化就引用它
(3)内存分配成功并且已经初始化,但操作越过了内存的边界
(4)忘记了释放内存,造成内存泄漏
(5)释放了内存,却继续使用它
8.什么是段错误?
段错误就是指访问的内存超出了系统所给这个程序的内存空间,即访问了错误的内存段。
9.结构体和联合体的区别?
struct和union都是由多个不同的数据类型成员组成的,但在任何同一时刻,union中只存放了一个被选中的成员,而struct的所有成员都存在。
一个struct变量的总长度等于所有成员长度之和,union变量的长度等于最长的成员的长度。
10.什么是预处理?
预处理是指在进行编译的第一遍扫描之前所做的工作。宏定义、文件包含、条件编译等都在预处理阶段。