2020年度西山居笔试题_第1页
2020年度西山居笔试题_第2页
2020年度西山居笔试题_第3页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、西山居笔试题西山居笔试题1、char szTest= " 12345tnOabcdO ” ,求 strle nszText = 7, sizeofszTest = 14.strlen是函数,运行时才能确定,因此它只计算 了12345tn而sizeof是操作符,它包括所有 的字符 12345tn0abcd0,还要加一个结束字符,因此为 13=1 =142、Intan Test510; i ntnl=&an Test4-&an Test0,n2=&an Test3l-&an Testl3;贝 Unl=4, n2=18;注意计算第一个的时候能够想一下指向数组

2、的指针,当指针+1的时候实际上是加了一个数组长度,这个题反过来想比较好做3、Char szNum= "" , int n=* ( short* )(szNum+4) - * (short* ) (szNum);贝! J n=1028;这里(short*) (szNum)是指向12为内存单元 为00000001 0000 0010即两个内存单元存储一个数,(short*) (szNum+4)是指向 56,内存 中存放为 00000101 0000 0110即两个内存单元 存储一个数4、Stl中二分查找法的函数名,稳定排序的函 数名,部分排序的函数名各是什么5、Stl中的map

3、常见数据结构中的红黑树实现。6、比较两数大小,返回较大值Int cmp(i nt x,i nt y)(Retur na>b?a:b;7、#include<iostream>Int cc(int i)For(;i<4;)Std: cout? cc(+i);Retur n i;Int mai n()Cc(l);Retur n 0;请输出结果:4444444&要增加一个类到某种类型的隐式转换可经过重载赋值操作符实现9、C+64位编译环境下,sizeof(i nt)=4,sizeofi nt *=8自己对于64位平台上各种数据类型分别占用多 少 字节,存在一些疑问,因此

4、用 C/C+中的sizeof分 别在这两种平台上进行了测试。运行结果如下:(分别用蓝色和红色标记了两者的差异)机器平台:X86_64处理器操作系统:编译0626Size1Size1ofcharis:ofun sig nedcharis:Size of sig ned char is:int1is:Sizeof4Sizeofshortis:Sizeoflong i8s:Sizeoflonginti s:8Sizeofsig nedinti s:4Sizeofint i4un sig neds:Size of un sig ned long int is:8Sizeoflonglongint is

5、:8Size of un sig ned long long is:8Size of float is:4Size of double is:8Size of long double is:16Size of (void *) is:8Size of (char *) is:8Size of (int *) is:8Size of (long *) is:8Size of (long long *) is: 8Size of (float *) is:8Size of (double * is:机器平台:X86_32处理器操作系统:Win dows XP SP2编译器:VS自带的C+编译器Si

6、zeof1Size of un sig ned char is:Size of sig ned char is:Size of int is:Size of short is:Size of long is:Size of long int is:Size of sig ned int is:Size of un sig ned int is:Size of un sig ned long int is:Size of long long int is:Size of un sig ned long long is:Size of float is:Size of double is:char

7、is:1142444448848Size of long double is:Size of (void *) is:4Size of (char *) is:4Size of (int *) is:4Size of (long *) is:4Size of (long long *) is: 4Size of (float *) is:4Size of (double *) is:4其实就是所有的指针扩充为 8位,Io ng变为8位, long doulbe 变为 16 位,注意 double 是没 有变化的10、列举 c+0x 的任意三个新特性11、unsigned int strilen

8、(const charApstr)_asmMov eax,pstrCmp byte ptreax,0Jz zreturnZloop: Cmp byte prteax,0 JnzzloopZreturn:Sub eax,pstr 二、诊断题。若错误,请写出错在哪里1、 全局变量与静态变量在内在中的存储位置是相同的。正确。lo 全局变量中 static 全局变量和普通全局变量 的区 别:相同点: 1) 共存于同一块内存(静 态存储区)中;2)生命期相同, 都是到整个程序的生命期;不同点: 1) 前者是内部连接,后者 是外部连接;2)作用域不同:前者的作用域是局部于它所在的文件的,也就是说在当前程序

9、中其它文件中是不能 使用它的,如果想在想其它文件中声明它为 extern 的来访问它,编译器就会报错,当然在其 它文件 中即使有同名的变量也不会有名字冲突 的问题;后者的作用域是整个程序中的所有 文件,能够在其它文件中声明它为 extern 来访 问 它,当然在整个程序中不论是否是同一个文件 都 不能有同名的普通全局变量,否则会有名字冲突,(如果在一个函数体内有与全局变量同名的 局部变量,那么局部变量会屏蔽全局变量,除非 使用作用域运算符 : :);2o 局部变量中的 static 变量和普通变更 的 区别:相同点:作用域相同,都是局部于 当前所在的函数体内。不同点: 1) 前者是内部连接,后

10、者 没有连接,因为普通局部变量是位于堆栈中,连 接器不知道它们;2)存储区域不同:前 者存放于静态存储区,后者存放于栈中;3)生命期不同:前者 是整个程序的生命期,后者是所在函数的生命期 (即随它所在的函数调用的结束而结束;4)初始化:前者只在函数第一 次被调用时初始化,当次调用时的变量值会保存 到下次调用时使用,也就只初始化一次;后者则 是在每次调用函数时都要重新创立它的存储空 间,重新初始化一次,即调用一次函数初始化一 次。2、Windows 操作系统中进程是基本执行单位。 答:错,在 Windows 中,线程是基本执行单位 , 进程是一个容纳线程的容器。进程是线程的资源 分配单元3、在栈

11、上分配内存和在堆上分配内存,效率 是一样的 答:堆的效率要低,堆是应用程序在运行的时候 请求操作系统分配给自己内存,由于从操作系统 管理的内存分配,因此在分配和销毁时都要占用 时间,因此用堆的效率非常低 . 可是堆的优点在 于,编译器不必知道要从堆里分配多少存储空 不必知道存储的数据要在堆里停留多长的 因此,用堆保存数据时会得到更大的灵活 4、 Sizeof 属于 C+ 内置函数间,也 时间, 性。答:错误 sizeof ()是一个操作符,不是函数, 在第一题中 sizeof 的值是 14,因为它不是运 定因此 行时确5、 构造函数只能定义为 public, 不能为protected 或 pr

12、ivate. 答:错误,如果你不想让外面的用户直接构造个类(假设这个类的名字为A)的对象,而希望用户只能构造这个类 A 的 子类,那你就能够 将类 A 的构造函数 / 析构函数声明为 protected, 而 将类 A 的子类的构造函数 / 析构函数声明为 public o如果将构造函数 / 析构函数声明为 private, 那只 能 这个类的“内部”的函数才能构造这个类的对象了。这里所说的“内部”是指类的成员函数。因为在外部不能定义对象,因此不能经过对象调用成员函数,如果想要调用成员函数的话,能够将成员函数定义为静态,然后经过类的:操作符调用, A& ra = A:Instance(

13、);ra.Print(); 即可6、C的qsort与C+的std:sort均采用快速 排 序,但 C效率高于 C+,故qsort的效率高 答: 错,与编译系统有关7、用new 份配的内存如果用delete释放,结果是一定会内存泄露。答:错误,在林锐的C+高质量编程中提到 如果用new创立对象数组,那么只能使用对象的无参数构造函数。例如Obj objects = new Obj100; / 创立 100 个动 态 对象不能写成 Obj 八objects = new Obj100(l);仓J立 1 00个动态对象的同时赋初值 1在用 delete 释放对象数组时,留意不要 丢 了符号 '

14、。例如delete objects; / 正确的用法delete objects; / 错误的用法后者相当于 delete objects0, 漏掉了另 外99个对象。而如果我们只是 int *p = new intl;则用 deledte 删除的时候就能够释放 p 指向的内 存,不会造成内存泄露8、全局对象及静态对象均在main 函数执行之 前构造。对三、 1 > unresolved extrenal Symbol 是什么错误? 原因是什么?不确定的外部“符号”,产生这个错误的原因 :如果连接程序不能在所有的库和目标文件内找到所引用的函数、变量或标签,将产生此错误消 息。一般来说,发

15、生错误的原因有两个:一是所引用的函数、变量不存在、拼写不正确或者使用 错误;其次可能使用了不同版本的连接库。2、线程死锁发生的原因?要防止死锁在 多线程编程中我们要注意什么?3、什么叫哈希算法?有什么应用?为 进 据 空4、列 举 Windows 中进程注入的方式。 了对内存中的某个进程进行操作,而且获得该 程地址空间里的数据,或者修改进程的私有数 结构,必须将自己的代码放在目标进程的地址 间里运行,这时就避免不了使用进程注入方法 了。进程注入的方法分类如下:带 DLL 的注入利用注册表注入 利用 Windows Hooks 注入 利用远程线程注入 利用特洛伊 DLL 注入 不带 DLL 的注

16、入直接将代码写入目标进程,并启动远程线程5、请从程序机制上解释缓冲区溢出攻击原理。当一个超长的数据进入到缓冲区时,超出部分就 会被写入其它缓冲区,其它缓冲区存放的可能是 数据、下一条指令的指针,或者是其它程序的输 出内容,这些内容都被覆盖或者破坏掉。可见一 小部分数据或者一套指令的溢出就可能导致一 个 程序或者 * 作系统崩溃。缓冲区溢出是当前导致“黑客”型病毒横行的主 要原因。从红色代码到 Slammer, 再到日前爆发 的 “冲击波 " ,都是利用缓冲区溢出漏洞的典型。 缓 冲区溢出是一个编程问题,防止利用缓冲区溢 出 发起的攻击,关键在于程序开发者在开发程序 时 仔细检查溢出情

17、况,不允许数据溢出缓冲区。 另 外,用户需要经常登录 * 作系统和应用程序提 供商 的网站,跟踪公布的系统漏洞,及时下载补 丁程 序,弥补系统漏洞6、简述 copy-on-write 机制及应用。 简单来说,在复制一个对象时并不是真的在内存 中把原来对象的数据复制一份到另外一个地址, 而是在新对象的内存映射表中指向同原对象相 同 的位置,而且把那块内存的 Copy-On-Write 位设为 lo 在对这个对象执行读操作的时候,内 存数据没 有变动,直接执行就能够。在写的时候 , 才真正将 原始对象复制一份到新的地址,修改新 对象的内 存映射表到这个新的位置,然后往这里 写。 这个技术需要跟虚拟

18、内存和分页同时使用,其好 处是在复制对象的时候因为并不是真的复制,而 只是建了一个“指针”,因而大大提高性能。但 这并不是一直成立的,前提是在复制新对象之 后,进行的写操作只是在一小部分的内存分页 上,大部分分页不会用到或者只是读取。不然会 产生大量的分页错误,得不偿失。作用是提高内存的使用率和共享率,在线程同 步,迟缓写入等方面都有应用7、解释函数声明中三个 const 作用。Template<class T>void Fun(const T* const &p)const;四、编程题1、以下函数把传入的两个整数值存到一个 Buffer 里,完成函数实现。Bool StroredDataToBuffer(int a,int b,char *pBuffer,unsigned int

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论