1. 数据存放在哪?
A. bss段存放没有初始化和初始化为0的全局变量;
B. data段存放初始化为非0的全局变量;
C. rodata存放常量数据;
D. text段存放代码和部分整数常量;
E. 栈(stack)存放临时变量和函数参数;
F. 堆(heap)最灵活的内存,生命周期由使用者控制。
2. bss段和data段区别
bss的全局变量只占运行时的内存空间,而不占用文件空间;
data的全局变量即占文件空间,又占运行时的内存空间。
两者作为全局变量,在整个程序的运行周期内,数据一直存在。
3. 内存分配方式?
A. 从静态存储区分配:内存在程序编译时就已分配好,这个内存在程序的整个运行期 间都存在;
B. 在栈上创建:执行函数时,函数内局部变量的存储单元都可在栈上创建,函数执行 结束时,这些存储单元自动被释放;
C. 从堆上分配(动态内存分配):程序运行时申请的内存,程序员负责在何时释放。
4. 野指针成因?
A. 指针变量没有被初始化。指针变量刚被创建时不会自动成为NULL指针,默认值随 机;
B. 指针被free或delete后,没有置为NULL。
5. 段错误及调试方法
段错误:访问了不能访问的内存。
调试方法:a.利用gdb逐步查找段错误;
b.分析core文件;
c.段错误时启动调试;
d.利用backtrace和objdump进行分析。
6. 宏定义
宏定义:由源程序中的宏定义完成;宏替换:由预处理程序自动完成。
无参宏定义:无参的宏名后不带参数。形式:#define 标识符 字符串,以“#”开头的 均为预处理命令。
带参宏定义:在宏定义中的参数称为形参,在宏调用中的参数称为实参。在调用中不仅 要宏展开,还要用实参代换形参。定义形式:#define 宏名(形参表) 字符串,字符 串中含有各形参;调用形式:宏名(实参表);。
7.文件包含
形式:#include “文件名”。功能:把指定的文件插入该命令行位置取代该命令行,从而把指定的文件和当前的源程序文件连成一个源文件。
注:a.包含命令中的文件名可以用双引号或尖括号,尖括号:在包含文件目录中查找;
双引号:在当前的源文件目录查找;
b.一个include命令只能指定一个被包含文件;
c.文件包含允许嵌套。
8. 结构体
要传送的不是简单的字节流(char型数组),而是多种数据组合起来的一个整体,其表现形式是一个结构体。
结构体和数组的比较:都由多个元素组成;各个元素在内存中的存储空间是连续的;数组中各个元素的数据类型相同,而结构体中各元素的数据类型可以不相同。
9. 常量数据
A. 常量不一定放在rodata,有的立即数直接和指令编码在一起,存放在代码段(test)中;
B. 对于字符串常量,编译器会自动去除重复的字符串,保证一个字符串在一个可执行文件中只存在一份复制;
C. rodata在多个进程间是共享的;
D. 常量不可修改;
E. 可通过XIP技术直接读取。
10. 堆和栈
栈:从高地址向低地址扩展,同时有esp指针一直指向栈顶(低地址),另外栈的原则是先入后出。
堆:malloc用来分配一块指定大小的内存;realloc用来调整/重分配一块存在的内存;free用来释放不再使用的内存