#include
void fn1( void ), fn2( void ), fn3( void ), fn4( void ); // atexit()以栈的方式注册函数,先注册的函数会后执行。 void main( void ) {
atexit( fn1 ); atexit( fn2 ); atexit( fn3 ); atexit( fn4 );
printf( \
return; }
void fn1() {
printf( \}
void fn2() {
printf( \}
void fn3() {
printf( \}
void fn4() {
printf( \}
4.一个父类写了一个virtual 函数,如果子类覆盖它的函数不加virtual ,也能实现多态? 在子类的空间里,有没有父类的这个函数,或者父类的私有变量?
只要基类在定义成员函数时已经声明了virtue关键字,在派生类实现的时候覆盖该函数时,virtue关键字可加可不加,不影响多态的实现。如果子类使用了virtual关键字,则可通过重载实现对父类虚函数的隐藏。 容易与隐藏混淆:
隐藏是指派生类的函数屏蔽了与其同名的基类函数,规则如下:
1) 如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)。
2) 如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)。
5.给一个字符串、例如 “ababc”要求返回“ab”. 因为“ab”连续重复出现且最长。 用C/C++语言写一函数完成该算法,给出复杂度
6.对序列1、1、2、3、5、8、13。。。。 是Fab..数列
2、3、5、13...是Fab..质数数列,因为他们与自己前面的Fab...数列都互质 给出k,返回第k小的Fab..质数
7.101个硬币100真、1假,真假区别在于重量。请用无砝码天平称两次给出真币重还是假币重的结论。 方法1:
把硬币分成50,50,1。
称50与50,如果平衡,则这两堆为真币,剩下的1为假币。再用这个假币和真币称一下得结论。
若不平衡,则1为真币,接着判断假币在哪个堆里面。
取轻的1堆,分成25,25,称重。若平衡则假币在另一堆里面,假币重。 若不平衡,则假币在这一堆中,假币轻。
方法2:
把硬币分成33,33,34。
称33与33,如果平衡,则这两堆为真币,假币在第三堆中。从66中取出34与第三堆进行称,第三堆所在的天平的那一端的轻重就是假币的轻重情况。
若不平衡,则假币在这两堆中。取下轻的一堆,从34里面取出33替换,称量。如果平衡,代表取下的那一堆中有假币,假币是轻的。如果不平衡,代表取下的那一堆是真币,假币是重的。
8.完成字符串拷贝可以使用 sprintf、strcpy 及 memcpy 函数,请问这些函数有什么区别,你喜欢使用哪个,为什么?
9.变量的声明和定义有什么区别?
一般来说我们把分配变量地址和存储空间的称为定义,不分配地址的称为声明。 声明只是告诉编译器,有这个变量,具体在哪里让它自己去找。 定义则是把具体的存储位置也告诉了编译器。 extern表示外部的变量,是声明而不是定义。
10.请写出下面代码在 32 位平台上的运行结果,并说明 sizeof 的性质: #include
int main(void) {
char a[30];
char *b = (char *)malloc(20 * sizeof(char)); printf(\ //30 printf(\ //4 printf(\//1 printf(\//4 printf(\// 1 return 0 ; }
添加:问:int **a[3][4],分配多少空间?
首先它是一个3*4大小的数组,数组中存放的是int**型数据,其实该题就是在问int **的大小,int*、int**、float*、float**、char*、char**都是占4个字节,所以结果为: 3*4*4=48
NetFetch [2006-06-20 11:18 AM] 4.
#i nclude \
#define SQR(X) X*X
int main(int argc, char* argv[]) {
int a = 10; int k = 2; int m = 1;
a /= SQR(k+m)/SQR(k+m); printf(\
return 0; }
这道题目的结果是什么啊?
define 只是定义而已,在编择时只是简单代换X*X而已,并不经过算术法则的 a /= (k+m)*(k+m)/(k+m)*(k+m); =>a /= (k+m)*1*(k+m); =>a = a/9; =>a = 1;
NetFetch [2006-06-20 11:17 AM]
3.请简单描述Windows内存管理的方法。
内存管理是操作系统中的重要部分,两三句话恐怕谁也说不清楚吧~~ 我先说个大概,希望能够抛砖引玉吧
当程序运行时需要从内存中读出这段程序的代码。代码的位置必须在物理内存中才能被运
行,由于现在的操作系统中有非常多的程序运行着,内存中不能够完全放下,所以引出了虚拟内存的概念。把哪些不常用的程序片断就放入虚拟内存,当需要用到它的时候在load入主存(物理内存)中。这个就是内存管理所要做的事。内存管理还有另外一件事需要做:计算程序片段在主存中的物理位置,以便CPU调度。
内存管理有块式管理,页式管理,段式和段页式管理。现在常用段页式管理
块式管理:把主存分为一大块、一大块的,当所需的程序片断不在主存时就分配一块主存空间,把程 序片断load入主存,就算所需的程序片度只有几个字节也只能把这一块分配给它。这样会造成很大的浪费,平均浪费了50%的内存空间,但时易于管理。
页式管理:把主存分为一页一页的,每一页的空间要比一块一块的空间小很多,显然这种方法的空间利用率要比块式管理高很多。
段式管理:把主存分为一段一段的,每一段的空间又要比一页一页的空间小很多,这种方法在空间利用率上又比页式管理高很多,但是也有另外一个缺点。一个程序片断可能会被分为几十段,这样很多时间就会被浪费在计算每一段的物理地址上(计算机最耗时间的大家都知道是I/O吧)。
段页式管理:结合了段式管理和页式管理的优点。把主存分为若干页,每一页又分为若干段。好处就很明显,不用我多说了吧。
各种内存管理都有它自己的方法来计算出程序片断在主存中的物理地址,其实都很相似

