笔试题目搜集(5)

来源:互联网 发布:手机淘宝看注册时间 编辑:程序博客网 时间:2024/05/22 12:06

笔试题目搜集系列推荐:

(1)笔试题目搜集1

(2)笔试题目收集2

(3)笔试题目搜集3

(4)笔试题目搜集4

(5)笔试题目搜集5




1.下面printf执行的结果

  1. int main(void)  
  2. {  
  3.     char a = 255;  
  4.     printf("%d\n",sizeof(++a));  
  5.     printf("%d\n",a);  
  6.     return 0;  
结果:1  -1。据说sizeof这句话并没有执行

  1. int main(void)  
  2. {  
  3.     char a = 255;  
  4.     printf("%x\n",a);
  5.     return 0;  
结果:ffffffff,高位自动补1了?

int p = 1234printf("%2d\n",p)

结果:1234。不明真相


2.下列程序发生什么错误

#include <iostream>#include <cstdlib>#include <vector>using namespace std;class CDemo{public:CDemo():str(NULL){}~CDemo(){if(str) delete[]str;}char *str;};int main(){CDemo d1;d1.str = new char[32];strcpy(d1.str,"sjflsj");vector<CDemo>*a1 = new vector<CDemo>();a1->push_back(d1);//1delete a1;//2return 0;}

结果:重复delete同一片内存,程序崩溃。//1处的语句调用,vector的push_back(),此时会调用CDemo的复制构造函数,复制一个临时对象CDemo,插入vector。但是由于CDemo没有定义复制构造函数,由系统生成的构造函数为浅拷贝,这就导致生成的对象和d1指向了同一片内存。//2处的语句会释放str指向的内存空间,局部变量d1离开作用域也会释放str指向的空间,造成程序崩溃。


3.下面程序有什么问题

#include <iostream>#include <vector>using namespace std;void print(vector<int>ivec){vector<int>::iterator iter;for(iter=ivec.begin(); iter!=ivec.end();++iter){cout<<*iter<<" ";}}int main(){vector<int>ivec;ivec.push_back(1);ivec.push_back(6);ivec.push_back(6);ivec.push_back(5);vector<int>::iterator iter1,iter2;for(iter1=ivec.begin(); iter1!=ivec.end();){if(*iter1 == 6){iter2 = iter1;ivec.erase(iter2);--iter1;}++iter1;}print(ivec);system("pause");}

这是一个迭代器失效问题,只能删除第一个6以后的迭代器就失效了,不能删除后面的元素了。iter2=iter1,这句说明iter1和iter2是一样的,erase(iter2),这时指针已指向下一个元素6了,在iter1++,指向了元素3.


4.Windows下的内存是如何管理的?

Windows提供了3种方法来进行内存管理:虚拟内存,最适合用来管理大型对象或者结构数组;内存映射文件,最适合用来管理大型数据流(通常来自文件)以及在单个计算机上运行多个进程之间共享数据;内存堆栈,最适合用来管理大量的小对象。

Windows操纵内存可以分两个层面:物理内存和虚拟内存。

其中物理内存由系统管理,不允许应用程序直接访问,应用程序可见的只有一个2G地址空间,而内存分配是通过堆进行的。对于每个进程都有自己的默认堆,当一个堆创建后,就通过虚拟内存操作保留了相应大小的地址块(不占有实际的内存,系统消耗很小)。当在堆上分配一块内存时,系统在堆的地址表里找到一个空闲块(如果找不到,且堆创建属性是可扩充的,则扩充堆大小),为这个空闲块所包含的所有内存页提交物理对象(在物理内存上或硬盘的交换文件上),这时就可以访问这部分地址。提交时,系统将对所有进程的内存统一调配,如果物理内存不够,系统试图把一部分进程暂时不访问的页放入交换文件,以腾出部分物理内存。释放内存时,只在堆中将所在的页解除提交(相应的物理对象被解除),继续保留地址空间。

如果要知道某个地址是否被占用/可不可以访问,只要查询此地址的虚拟内存状态即可。如果是提交,则可以访问。如果仅仅保留,或没保留,则产生一个软件异常。此外,有些内存页可以设置各种属性。如果是只读,向内存写也会产生软件异常。


5.看以下代码:(迅雷笔试题)
[cpp] view plaincopy
  1. class parent  
  2. {  
  3. public:  
  4.     virtual void output();  
  5. };  
  6. void parent::output()  
  7. {  
  8.     printf("parent!");  
  9. }  
  10.   
  11. class son : public parent  
  12. {  
  13. public:  
  14.     virtual void output();  
  15. };  
  16. void son::output()  
  17. {  
  18.     printf("son!");  
  19. }  
则以下程序段:
son s;
::memset(&s , 0 , sizeof(s));
parent& p = s;
p.output();
执行结果是()
A、parent!       B、son!       C、son!parent!           D、没有输出结果,程序运行出错

6、已知一段文本有1382个字符,使用了1382个字节进行存储,这段文本全部是由a、b、c、d、e这5个字符组成,a出现了354次,b出现了483次,c出现了227次,d出现了96次,e出现了232次,对这5个字符使用哈夫曼(Huffman)算法进行编码,则以下哪些说法正确()(迅雷笔试题目)
A、使用哈夫曼算法编码后,用编码值来存储这段文本将花费最少的存储空间
B、使用哈夫曼算法进行编码,a、b、c、d、e这5个字符对应的编码值是唯一确定的
C、使用哈夫曼算法进行编码,a、b、c、d、e这5个字符对应的编码值可以有多套,但每个字符编码的位(bit)数是确定的
D、b这个字符的哈夫曼编码值位数应该最短,d这个字符的哈夫曼编码值位数应该最长


7.i++与++i的区别

首先:++i效率高点。

原因是:++i 只是本身加1没有额外开辟空间,而i++需要建立额外对象。

前提:编译器没有做优化。


原创粉丝点击