21
2020
03

以下为Windows NT下的32位C++程序,请计算sizeof的值

void Func ( char str[100] ) {  sizeof( str ) = ? } void *p = malloc( 100 ); sizeof ( p ) = ?sizeof( str ) = 4   sizeof ( p ) = 4  
21
2020
03

分别给出BOOL,int,float,指针变量 与“零值”比较的 if 语句

BOOL型变量:if(!var)   int型变量: if(var==0)   float型变量:   const float EPSINON = 0.00001;   if ((x >= - EPSINON) && (x <= EPSINON)   指针变量:if(var==NULL)   
21
2020
03

指出代码错误

void Test( void ) {  char *str = (char *) malloc( 100 );  strcpy( str, "hello" );  free( str );   ... //省略的其它语句 }错误有二:使用malloc分配内
21
2020
03

写出完整版的strcpy函数

char * strcpy( char *strDest, const char *strSrc )  {  assert( (strDest != NULL) && (strSrc != NULL) );  char *address = strDest;
21
2020
03

怎么判断两个链表是否有交点?

答:假设一个链表长为n,另一个链表长为m,让长的链表的指针先走|n-m|个长度,再让两个链表的指针一起走,最后两个指针相遇的地方就是交点了(画图!画图!)
21
2020
03

单向链表怎么取到倒数第k个元素?

答:设置两个指针p1p2,让p2 先走k步,然后再让p1p2同时走,最后若p2 指向的节点的下一个节点是NULL ,那么输出p1即可。(画个图就明白了)
21
2020
03

再扩展: 这个链表的长度是多少?

答:上一个问题我们自然可以得到起点到成环点的距离,那么再回到第一个问题的情况,p1p2相遇了,那么再让他们继续走下去,再次相遇所经过的操作数就是这个环的长度了,这两者相加就得到了整个链表的长度。
21
2020
03

扩展:并指出成环的点在哪里?

答:这个lz 也是在网上看了人家的博客才知道的,当p1p2 指向同一个节点的时候,让p1 指向第一个节点,p2 不动,然后让两个节点以同样的速度指向下一个节点,最后p1p2相遇的地方就是成环的点。
21
2020
03

单向链表如何判断是否成环?

答:两个指针p1,p2 , 其中p1 每次指向下一个节点,p2每次指向下两个节点(p2=p2->next->next),这样若链表有环,那么p1p2必定在某一点指向同一个节点。
21
2020
03

100大小的数组放了1-99 100个数,只有一个数重复了,找出重复的那个数。

答:解法很简单,把这100个数加起来,然后逐一剪掉1-99 剩下的那个数就是重复的数。
21
2020
03

老鼠喝药的问题:

就是告诉你,有n瓶药,里面有一瓶是毒药,老鼠喝了就会死,让你用最少的老鼠测出来,到底哪一瓶是毒药。答:利用二进制的思想,将所有的药水按照1-n的编号,对应的老鼠喝下二进制上对应位为1 的药水,观察老鼠死的状态,得到答案,比如说 3瓶药水,1号药水 01 2号药水 10 三号药水 11,那么最少需要2^2=4>3 ,两只老鼠就可以了,一号老鼠喝下2和3 号药水,二号老鼠喝下 1 和 3 号药水,要是一号老鼠挂掉了,二号老鼠没挂,证明毒药水是 10=2 号药水,以此类推。
21
2020
03

在什么时候需要使用“常引用”? 

如果既要利用引用提高程序的效率,又要保护传递给函数的数据不在函数中被改变,就应使用常引用。常引用声明方式:const 类型标识符 &引用名=目标变量名;例1int a ;const int &ra=a;ra=1; //错误a=1; //正确例2string foo( );void bar(string & s);那么下面的表达式将是非法的:bar(foo( ));bar("hello world");原因在于foo( )和"hello wor
21
2020
03

全局变量和局部变量有什么区别?是怎么实现的?操作系统和编译器是怎么知道的?

【参考答案】生命周期不同:全局变量随主程序创建和创建,随主程序销毁而销毁;局部变量在局部函数内部,甚至局部循环体等内部存在,退出就不存在;使用方式不同:通过声明后全局变量程序的各个部分都可以用到;局部变量只能在局部使用;分配在栈区。 操作系统和编译器通过内存分配的位置来知道的,全局变量分配在全局数据段并且在程序开始运行的时候被加载。局部变量则分配在堆栈里面 。
21
2020
03

基类的析构函数不是虚函数,会带来什么问题?

【参考答案】派生类的析构函数用不上,会造成资源的泄漏。
21
2020
03

内存的分配方式有几种?

【参考答案】一、从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量。二、在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。三、从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最