预习

本文探讨了程序内存管理的关键方面,包括rodata的特点、内存分配方式、常见内存错误及如何避免,同时还讨论了文件包含命令的使用要点、带参宏定义与自定义函数的区别、结构体与数组的比较等重要内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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字节的空间;否则其他任何情况下,一个位段结构所占的空间至少是一个 位段存储单元的大小。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值