1、rodata需要注意的几点
1)常量不一定就放在rodata里,有的立即数直接和指令编码一起,存放在代码段中。
2)对于字符串常量,编译器会自动去掉重复的字符串,保证一个字符串在一个可执行文件中只存在一份复制
3)常量是不能被修改的
4)在有的 嵌入式系统中,rodata存放在ROM里,运行时直接读取,无须加载到RAM中
5)rodata是在多个进程间共享的
2、内存的分配方式
1)从静态存储区域分配。
2)在栈上创建
3)从堆上分配,也称动态内存分配
3、野指针是如何形成的
1)指针变量没有初始化。
2)p指针被free或 delete后 没有置为NULL,让人误以为p是个合法的指针。
4、常见的内存错误
1)内存未分配成功却使用了它。 在使用之前检查指针是否为NULL。如果指针p是函数的参数,那么在函数的入口处用“assert(p!=NULL)”进行检查。若果是用malloc或new来申请内存,应该用“if(p==NULL)”或if(p!=NULL)进行防错处理。
2)内存虽然分配成功,单尚未初始化就使用它
3)内存分配成功并且已经初始化,但操作越过了内存的边界
4)忘记了释放内存,造成内存遗漏。
5)释放了 内存却继续使用它
5、链接阶段的主要任务
处理具有全局作用域的标识符在多个文件中的使用问题。
6、对文件包含命令需要说明哪几点
1)包含命令的文件中可以用双引号括起来,也可以用尖括号括起来
2)一个include命令只能指定一个被包含文件,若有多个文件被包含,则需要多个include命令
3)文件包含允许嵌套,即在一个被包含的文件中又可以包含另一个文件
7、带参宏定义与自定义函数的区别
1)在带参宏定义中,形式参数不分配内存单元,因此不必作类型定义;而宏调用中的实参有具体的值,要用他们去代换形参,因此必须作类型说明。
2)在宏定义中的 形参是标识符,而宏调用中的 实参可以是表达式
8、结构体与数组的比较
都由多个元素组成;
各个元素在内存中的存储结构是连续的;
数组中的各个元素的 数据类型都相同,而结构体中的各个元素的数据类型可以不相同。
9、结构体和联合体的区别
union中只存放了一个被选中的成员,而struct的所有成员都存在。在structural中,各成员都占有自己的内存空间,它们是同时存在的,一个struct变量的总长度等于所有成员的总长度之和;在union中,所有成员不能占用它的内存空间,它们不能同时存在,union变量的长度等于最长的成员的长度。 对于union的不同成员赋值,将会对其它成员重写,原来成员的值就不存在了,而对于struct的不同成员赋值时互不影响的。
10、位段结构在内存中的的存储方式
1)若一个位段存储单元能够存储位段结构中的所有成员,那么位段结构中的所有成员只能放在一个位段存储单元中,若一个位段存储单元不能容纳位段结构中的所有成员,那么剩余的位段从下一个位段存储单元开始存放。
2)如果一个位段结构中只有一个占有0位的无名位段,则只占1或0字节的空间;否则其他任何情况下,一个位段结构所占的空间至少是一个 位段存储单元的大小。