笔试题目搜集(5)

笔试题目搜集系列推荐:

(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 = 1234
printf("%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);//1
	delete a1;//2

	return 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 plain copy
  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++需要建立额外对象。

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


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值