;
return p;
}
void Test(void){
char *str=NULL; //内存泄露
str=GetMemory(){
strcpy(str,”hello world”);
printf(str);
}
方法二:void GetMemory2(char **p)变为二级指针.
void GetMemory2(char **p, int num)
{
*p = (char *)malloc(sizeof(char) * num);
}
《高质量C++编程》
————————————————————————–
35.程序改错
class mml
{
private:
static unsigned int x;
public:
mml(){ x++; }
mml(static unsigned int &) {x++;}
~mml{x–;}
pulic:
virtual mon() {} = 0;
static unsigned int mmc(){return x;}
……
};
class nnl:public mml
{
private:
static unsigned int y;
public:
nnl(){ x++; }
nnl(static unsigned int &) {x++;}
~nnl{x–;}
public:
virtual mon() {};
static unsigned int nnc(){return y;}
……
};
代码片断:
mml* pp = new nnl;
……….
delete pp;
A:
基类的析构函数应该为虚函数
virtual ~mml{x–;}
————————————————————————–
36.101个硬币100真、1假,真假区别在于重量。请用无砝码天平称两次给出真币重还是假币重的结论。
答:
101个先取出2堆,
33,33
第一次称,如果不相等,说明有一堆重或轻
那么把重的那堆拿下来,再放另外35个中的33
如果相等,说明假的重,如果不相等,新放上去的还是重的话,说明假的轻(不可能新放上去的轻)
第一次称,如果相等的话,这66个肯定都是真的,从这66个中取出35个来,与剩下的没称过的35个比
下面就不用说了
方法二:
第3题也可以拿A(50),B(50)比一下,一样的话拿剩下的一个和真的比一下。
如果不一样,就拿其中的一堆。比如A(50)再分成两堆25比一下,一样的话就在
B(50)中,不一样就在A(50)中,结合第一次的结果就知道了。
————————————————————————–
37.static变量和static 函数各有什么特点?
答:
static变量:在程序运行期内一直有效,如果定义在函数外,则在编译单元内可见,如果在函数内,在在定义的block内可见;
static函数:在编译单元内可见;
————————————————————————–
38.用C 写一个输入的整数,倒着输出整数的函数,要求用递归方法 ;
答:
void fun( int a )
{
printf( “%d”, a%10 );
a /= 10;
if( a <=0 )return;
fun( a );
}
————————————————————————–
39.写出程序结果:
void Func(char str[100])
{
printf(“%d\n”, sizeof(str));
}
答:
4
分析:
指针长度
————————————————————————–
40.int id[sizeof(unsigned long)];
这个对吗?为什么
答:
对
这个 sizeof是编译时运算符,编译时就确定了
可以看成和机器有关的常量。