笔试题目搜集系列推荐:
(1)笔试题目搜集1
(2)笔试题目收集2
(3)笔试题目搜集3
(4)笔试题目搜集4
(5)笔试题目搜集5
1.下面printf执行的结果
- int main(void)
- {
- char a = 255;
- printf("%d\n",sizeof(++a));
- printf("%d\n",a);
- return 0;
- }
- int main(void)
- {
- char a = 255;
- printf("%x\n",a);
- return 0;
- }
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地址空间,而内存分配是通过堆进行的。对于每个进程都有自己的默认堆,当一个堆创建后,就通过虚拟内存操作保留了相应大小的地址块(不占有实际的内存,系统消耗很小)。当在堆上分配一块内存时,系统在堆的地址表里找到一个空闲块(如果找不到,且堆创建属性是可扩充的,则扩充堆大小),为这个空闲块所包含的所有内存页提交物理对象(在物理内存上或硬盘的交换文件上),这时就可以访问这部分地址。提交时,系统将对所有进程的内存统一调配,如果物理内存不够,系统试图把一部分进程暂时不访问的页放入交换文件,以腾出部分物理内存。释放内存时,只在堆中将所在的页解除提交(相应的物理对象被解除),继续保留地址空间。
如果要知道某个地址是否被占用/可不可以访问,只要查询此地址的虚拟内存状态即可。如果是提交,则可以访问。如果仅仅保留,或没保留,则产生一个软件异常。此外,有些内存页可以设置各种属性。如果是只读,向内存写也会产生软件异常。
- class parent
- {
- public:
- virtual void output();
- };
- void parent::output()
- {
- printf("parent!");
- }
- class son : public parent
- {
- public:
- virtual void output();
- };
- void son::output()
- {
- printf("son!");
- }
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++需要建立额外对象。
前提:编译器没有做优化。