C与C经典面试题内存泄露汇总

上传人:206****923 文档编号:90865814 上传时间:2019-06-19 格式:DOC 页数:19 大小:78KB
返回 下载 相关 举报
C与C经典面试题内存泄露汇总_第1页
第1页 / 共19页
C与C经典面试题内存泄露汇总_第2页
第2页 / 共19页
C与C经典面试题内存泄露汇总_第3页
第3页 / 共19页
C与C经典面试题内存泄露汇总_第4页
第4页 / 共19页
C与C经典面试题内存泄露汇总_第5页
第5页 / 共19页
点击查看更多>>
资源描述

《C与C经典面试题内存泄露汇总》由会员分享,可在线阅读,更多相关《C与C经典面试题内存泄露汇总(19页珍藏版)》请在金锄头文库上搜索。

1、C、C+语言面试题2007-07-15 18:571已知strcpy 函数的原型是:char *strcpy(char *strDest, const char *strSrc);其中strDest 是目的字符串,strSrc 是源字符串。不调用C+/C 的字符串库函数,请编写函数 strcpy答案:char *strcpy(char *strDest, const char *strSrc)if ( strDest = NULL | strSrc = NULL)return NULL ;if ( strDest = strSrc)return strDest ;char *tempptr =

2、 strDest ;while( (*strDest+ = *strSrc+) != 0);return tempptr ;2已知类String 的原型为:class Stringpublic:String(const char *str = NULL); / 普通构造函数String(const String &other); / 拷贝构造函数 String(void); / 析构函数String & operate =(const String &other); / 赋值函数private:char *m_data; / 用于保存字符串;请编写String 的上述4 个函数。答案:Stri

3、ng:String(const char *str)if ( str = NULL ) /strlen在参数为NULL时会抛异常才会有这步判断m_data = new char1 ;m_data0 = 0 ;elsem_data = new charstrlen(str) + 1;strcpy(m_data,str);String:String(const String &other)m_data = new charstrlen(other.m_data) + 1;strcpy(m_data,other.m_data);String & String:operator =(const Str

4、ing &other)if ( this = &other)return *this ;delete m_data;m_data = new charstrlen(other.m_data) + 1;strcpy(m_data,other.m_data);return *this ;String: String(void)delete m_data ;3.简答3.1 头文件中的ifndef/define/endif 干什么用?答:防止该头文件被重复引用。3.2#include 和#include “filename.h” 有什么区别?答:对于#include ,编译器从标准库路径开始搜索fil

5、ename.h对于#include “filename.h”,编译器从用户的工作路径开始搜索filename.h3.3 在C+ 程序中调用被C 编译器编译后的函数,为什么要加extern “C”?答:C+语言支持函数重载,C 语言不支持函数重载。函数被C+编译后在库中的名字与C 语言的不同。假设某个函数的原型为: void foo(int x, int y);该函数被C 编译器编译后在库中的名字为_foo , 而C+ 编译器则会产生像_foo_int_int 之类的名字。C+提供了C 连接交换指定符号extern“C”来解决名字匹配问题。3.4 一个类有基类、内部有一个其他类的成员对象,构造函

6、数的执行顺序是怎样的。(Autodesk)答:先执行基类的(如果基类当中有虚基类,要先执行虚基类的,其他基类则按照声明派生类时的顺序依次执行),再执行成员对象的,最后执行自己的。3.5 请描述一个你熟悉的设计模式(Autodesk)3.6 在UML 中,聚合(aggregation)和组合(composition)有什么区别 Autodesk)答案:聚合关系更强,类似于pages 和book 的关系;组合关系要弱,类似于books和bookshelf 的关系。3.7C#和C+除了语法上的差别以外,有什么不同的地方?(Autodesk,Microsoft)答案:(C#我只是了解,不是很精通)(1

7、) c#有垃圾自动回收机制,程序员不用担心对象的回收。(2)c#严禁使用指针,只能处理对象。如果希望使用指针,则仅可在unsafe 程序块中能使用指针。(3)c#只能单继承。(4)必须通过类名访问静态成员。不能像C+中那样,通过对象访问静态成员。(5)在子类中覆盖父类的虚函数时必须用关键字override,覆盖父类的方法要用关键字new3.8ADO.net 和ADO 的区别?答案:实际上除了“能够让应用程序处理存储于DBMS 中的数据“这一基本相似点外,两者没有太多共同之处。但是ADO 使用OLE DB 接口并基于微软的COM 技术,而ADO.NET 拥有自己的ADO.NET 接口并且基于微软

8、的.NET 体系架构。众所周知.NET 体系不同于COM 体系,ADO.NET 接口也就完全不同于ADO和OLE DB 接口,这也就是说ADO.NET 和ADO是两种数据访问方式。ADO.net 提供对XML 的支持。3.9 New delete 与malloc free 的区别 ( Autodesk)区别: 1. new 自动计算需要分配的空间,而malloc要手动计算分配的空间。 2. new 是类型安全的,而malloc不是。 如: int * p = new double3; /编译时能够检查出错误 int* p = malloc(n*sizeof(double);/编译时不能够检查出

9、错误 3. malloc/free需要库文件支持,而new/delete不用。 4. operator new 对应于malloc, 但operator new 可以重载,可以自定义内存分配策略,甚至不做内存分配。但malloc做不到。 5. new 能为非内部数据分配动态内存,而malloc不能。 3.9.2那为什么有了new/delete,还要malloc/free呢?3.10 #define DOUBLE(x) x+x (Autodesk)i = 5*DOUBLE(10); i 是多少?正确的声明是什么?答案:i 为60。正确的声明是#define DOUBLE(x) (x+x)3.11

10、 有哪几种情况只能用intialization list 而不能用assignment? (Autodesk)答案:当类中含有const、reference 成员变量;基类的构造函数都需要参数;类中含有其他类的成员对象,而该类的构造函数都需要参数。3.11 C+是不是类型安全的? (Autodesk)答案:不是。两个不同类型的指针之间可以强制转换。C#是类型安全的。3.12 main 函数执行以前,还会执行什么代码? (Autodesk)答案:全局对象的构造函数会在main 函数之前执行。3.13 描述内存分配方式以及它们的区别。 (Autodesk , Microsoft)答案:1) 从静态

11、存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static 变量。(2) 在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集。(3) 从堆上分配,亦称动态内存分配。程序在运行的时候用malloc 或new 申请任意多少的内存,程序员自己负责在何时用free 或delete 释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。3.14 什么是虚拟存储器?virtual memory 怎样映射到physical memory?页面替换算法有哪些

12、? (Microsoft)见操作系统 p238 页。掌握的页面替换算法NRU(最近不用),FIFO,第二次机会页面替换算法,LRU(最近最少使用算法)3.15 有四个同样的容器,里面装满了粒数相同的药丸,正常药丸的质量为m,变质药丸的质量为m+1,现在已知这四个容器中,有一个装的全是变质药丸,用电子秤只称一次,找出哪个容器装的是变质药丸 (Microsoft)答案:把四个容器依次编号为1、2、3、4,然后从中分别取出1、2、3、4 粒药丸,称这10 粒药丸的质量,如果质量为10m+1,则说明第一个容器装的是变质药丸,如果为10m+2 则说明第二个装的变质药丸,依次类推。3.16 比较一下C+中

13、static_cast 和 dynamic_cast 的区别。 (Autodesk)dynamic_casts在帮助你浏览继承层次上是有限制的。它不能被用于缺乏虚函数的类型上,它被用于安全地沿着类的继承关系向下进行类型转换。如你想在没有继承关系的类型中进行转换,你可能想到static_cast3.17 Struct 和class 的区别 (Autodesk)答案:struct 中成员变量和成员函数默认访问权限是public,class 是private3.18 当一个类A 中没有生命任何成员变量与成员函数,这时sizeof(A)的值是多少,如果不是零,请解释一下编译器为什么没有让它为零。(Au

14、todesk)答案:肯定不是零。我举个反例,如果是零的话,声明一个class A10对象数组,而每一个对象占用的空间是零,这时就没办法区分A0,A1了 3.18 这道题我又找到答案了,为了确保每个对象都拥有唯一的地址!可查阅http:/ 在8086 汇编下,逻辑地址和物理地址是怎样转换的?(Intel)答案:通用寄存器给出的地址,是段内偏移地址,相应段寄存器地址*10H+通用寄存器内地址,就得到了真正要访问的地址。3.20 描述一下C+的多态 (microsoft)答案:C+的多态表现在两个部分,一个是静态连编下的函数重载,运算符重载;动态连编下的虚函数、纯虚函数(抽象类)4.写出BOOL,i

15、nt,float,指针类型的变量a 与零的比较语句。答案:BOOL : if ( !a )int : if ( a = 0)float : const EXPRESSION EXP = 0.000001if ( a -EXP)pointer : if ( a != NULL)5.请说出const 与#define 相比优点答案:(1) const 常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误。(2) 有些集成化的调试工具可以对const 常量进行调试,但是不能对宏常量进行调试。6简述数组与指针的区别数组要么在静态存储区被创建(如全局数组),要么在栈上被创建。指针可以随时指向任意类型的内存块。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 其它中学文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号