内存管理 预处理 结构体

Question one:未初始化的全局变量(.bbs)有什么特点?

bbs类型的全局变量只占运行时的内存空间,而不占用文件空间。

作为全局变量,在整个程序的运行周期内,bbs数据是一直存在的。

 

Question two:初始化过的全局变量(.data段)有什么特点?

Data类型的全局变量既占文件空间,又占用运行时的内存空间。同样作为全局变量,在整个程序的运行周期内,data数据是一直存在的。

 

Question three:内存分配方式有哪三种?

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

2)在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算使用内置于处理器的指令集,效率很高,但分配的内存容量有限。

3)从堆上分配,亦称动态内存分配。程序在运行时用malloc或new申请所需要的内存, 程序员自己负责在何时用free或delete释放内存。动态内存的生存期由程序员决定,使用非常灵活,但问題也最多。

 

Question four:什么是野指针?

野指针不是NULL指针,是指向“垃圾”内存的指针。

野指针的成因有两种:

(1)指针变量没有被初始化

(2)指针p被free或delete之后,没有置为NULL,让人误以为p是个合法的指针。

 

Question five:常见的内存错误及对策:

1)内存分配未成功,却使用了它。解决方法:在使用内存之前检查指针是否为NULL。一般使用malloc或new申请内存,应该用“if(p==NULL”或“if(p!=NULL”进行防错处理;

2)内存虽然分配成功,但是尚未初始化就引用它。解决方法:无论使用何种方式创建数组,都别忘了赋初值,即便是赋零值也不可省略;

3)内存分配成功并且初始化,但操作越过了内存的边界。

4)忘记释放内存,造成内存泄漏。动态内存的申请和释放,程序中malloc与free的使用次数一定要相同,否则肯定有错误(new/delete同理)。

 

Question six:文件包含的双引号和尖括号的区别:

   使用尖括号表示在包含文件目录中查找(包含目录是由用户在设置环境时设置的),而不在源文件目录去查找;使用双引号则表示首先在当前的源文件目录中查找,若未找到才到包含目录中查找。

 

Question seven:无参宏定义

#define 标识符 字符串

还要说明以下几点

(1) 宏定义是用宏名来表示符串,在宏展开时又以该字符串取代宏名,这只是种简单的代换,字符串中可以含任何字符,可以是常数,也可以是表达式,预处理程序对它不作任何检查。如有错误,只能在编译已被宏展开后的源程序时发现。

(2) 宏定义不是说明或语句,在行末不必加分号,如加上分号则连分号也一起置换。

(3) 宏定义必须写在函数之外,其作用域为宏定义命令起到源程序结束。如要终止其作用域可使用“#undef”。

(4)宏名在源程序中若用引号括起来,则预处理程序不对于其进行宏代换。

(5)宏定义允许嵌套,在宏定义的字符串中可以使用已经定义的宏名。在宏展开时由预处理程序层层代换。

(6)对“输出格式”作宏定义,可以减少书写麻烦。

 

Question eight:带参宏定义

#define 宏名(形参表) 字符串

调用的形式为:宏名(实参表);

带参宏定义与自定义函数的区别如下:

(1) 在带参宏定义中,形式参数不分配内存单元,因此不必作类型定义;而宏调用中的实参有具体的值,要用它们去代换形参,因此必须作类型说明。这与函数中的情况是不同的在函数中,形参和实参是两个不同的量,各有自己的作用域,调用时要把实参值赋予形参进行“值传递”。而在带参宏中,只是符号代换,不存在值传递的问题。

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

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

 

Question nine:#define typedef 的区别

typedef 只是为了增加可读性而为标识符另起的新名称(仅仅是个别名),而#define原本在C语言中是为了定义常量。到了C++语言, const,enum、inline的出现使它也渐渐成为了起别名的工具,有时很容易搞不清楚define与typedef两者到底该用哪个好,如“#define INT int ”这样的语句,用typedef一样可以完成,用哪个好呢?我主张用typedef,因为在早期的许多C编译器中这条语句是非法的,只是现今的编译器又做了扩充。为了尽可能地兼容,一般都遵循# define 定义“可读”的常量和一些宏语句,而typedef常用来定义关键字、冗长的类型的别名。宏定义只是简单的字符串代换(原地扩展),而typedef则不是原地扩展,它的新名字具有一定的封装性,以致新命名的标识符具有更易定义变量的功能( int*)PINT以及下面这行define PINT2 int

 

Question ten:结构体与数组比较有什么区别?

都由多个元素组成;

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

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值