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