预习内存管理、预处理、结构体

1、数据存放在哪里

bss段用来存放那些没有初始化和初始化为0的全局变量。bss类型的全局变量只占运行时的内存空间,而不占用文件空间

在整个陈红旭的运行周期内,bss数据是一直存在的

data段用来存放那些初始化为非零的全局变量。data类型的全局变量既占文件空间,又占用运行时的内存空间。同样作为

全局变量,data数据是一直存在的

rodata是用来存放常量数据的。注意:常量不一定就放在rodata里,有的立即数直接和指令编码放在一起,存放在代码段;

对于字符串常量,编译器会自动去掉重复的字符,保证一个字符串在一个可执行文件只存在一份复制;rodata在多个进程

间是共享的;常量是不能修改的。

字符串会被编译器自动放到rodata中,其他数据要放到rodata中,只需要加const关键字修饰。

text段存放代码(如函数)和部分整数常量,它与rodata段很相似,主要不同在于这个段是可以执行的

栈  用于存放临时变量和函数参数

堆  malloc、realloc、free

2、内存分配方式

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

从栈上创建:在执行函数时,函数内部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放

栈内存分配运算使用内置于处理器的指令集,效率很高,但分配的内存容量有限

从堆上分配:也称动态内存分配。程序在运行时用malloc或new申请所需要的内存,程序员自己负责在何时用free或delete

释放内存。动态内存的生存周期又程序员决定

3、带参宏定义与自定义函数的区别

在带参宏定义中,形式参数不分配内存单元,因此不必作类型转换;而宏调用中的实参有具体的值,要用他们去代换形参,

因此必须作类型说明。这与函数中的情况是不同的,在函数中,形参和实参时两个不同的量,各有自己的作用域,调用时要

把实参值赋予形参,进行“值传递”。而在带参宏中,只是符号代换,不存在值传递问题

在宏定义中的形参是标识符,而宏调用中的实参可以是表达式

注意:在宏定义中,字符串内的形参通常要用括号括起来以避免出错

4、包含命令中的文件名可以用双引号括起来,也可以用尖括号括起来,但是这两种形式是有区别的

使用尖括号表示在包含文件目录中去查找(包含目录是由用户在设置环境时设置的),而不再源文件目录去查找;使用双引号

则表示首先在当前的源文件目录中查找,若未找到才到包含目录中去查找。用户编程时可根据自己文件所在的目录来选择一种命令形式

5、什么是结构体

struct是个关键字,它将一些相关联的数据打包成一个整体,方便使用。在网络协议、通信控制、嵌入式系统、驱动开发等

地方,我们经常要传送的不是简单的字节流(char型数组),俄日是多种数据组合起来的一个整体,其表现形式是一个结构体

6、结构体与数组的比较

都由多个元素组成;

各个元素在内存中的存储空间是连续的;

数组中各个元素的数据类型相同,而结构体中的各个元素的数据类型可以相同

7、#define和typedef的区别

typedef只是为了增加可读性而为标识符另起的新名称,而#define原本在C语言中是为了定义常量。一般,#define定义

“可读”的常量和一些宏语句,而typedef则常用来定义关键字冗长的类型的别名。宏定义只是简单的字符串代换,而typedef

则不是原地扩展,它的新名字具有一定的封装性,以致新命名的标识符具有更易定义变量的功能

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

struct和union都是由多个不同的数据类型成员组成的,但在任何统一时刻,union中只存放了一个被选中的成员,而struct

的所有成员都存在,各成员都占有自己的内存空间,它们都是同时存在的,一个struct变量的总长度等于所有成员长度之和;

在union中,所有成员不能同时占有它都能诶村==内存,它们不能同时存在,union变量的长度等于最长的成员的长度。对于

union的不同成员赋值,将会对其他成员重写,原来成员的值就不存在了,而对于struct的不同成员赋值是互不影响的

9、位段的使用

位段的类型只能是int、unsigned、signed int三种类型,不能是char型或者浮点型

位段占的二进制位数不能超过该基本类型所能表示的最大位数

无名位段不能被访问,但会占据空间

不能对位段进行取地址操作

若位段的二进制位数为0,则这个位段必须是无名位段,下一个位段从下一个位段存储单元开始存放

若位段出现在表达式中,则会自动进行整形升级,自动转换成int型或者unsigned int

对位段赋值时,最好不要超过位段所表示的最大范围,否则可能造成意想不到的结果

位段不能出现数组的形式

10、位段结构在内存中的存储方式

如果一个位段存储单元能够存储位段结构中的所有成员,那么位段结构中的所有成员只能放在一个位段存储单元中,

不能放在两个位段存储单元中;如果一个位段存储单元不能容纳位段结构中的所有成员,那么从剩余的位段从下一个

位段存储单元开始存放

如果一个位段结构中只有一个占有0位的无名位段,则只占1或0字节的空间;否则其他情况下,一个位段结构所占的空间

至少是一个位段存储单元的大小


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值