面试中常见的C++面试题总结,快来看看,是否对你有帮助!
1、写出完整版的strcpy函数
char*strcpy(char*strDest,constchar*strSrc)
{
assert((strDest!=NULL)&;&;(strSrc!=NULL));
char*address=strDest;
while((*strDest++=*strSrc++)!=‘\0’);
returnaddress;
}
要点:
使用assert断言函数,判断参数是否为NULL;
遇'\0'则停止赋值;
返回新的字符串的首地址。
2、指出代码错误
voidTest(void)
{
char*str=(char*)malloc(100);
strcpy(str,"hello");
free(str);
...//省略的其它语句
}
错误有二:
使用malloc分配内存后,应判断是否分配成功;
free之后,应置str为NULL,防止变成野指针。
PS:malloc函数
malloc函数是一种分配长度为num_bytes字节的内存块的函数,可以向系统申请分配指定size个字节的内存空间。malloc的全称是memoryallocation,中文叫动态内存分配,当无法知道内存具体位置的时候,想要绑定真正的内存空间,就需要用到动态的分配内存。
第一、malloc函数返回的是void*类型。
对于C++,如果你写成:p=malloc(sizeof(int));则程序无法通过编译,报错:“不能将void*赋值给int*类型变量”。
所以必须通过(int*)来将强制转换。而对于C,没有这个要求,但为了使C程序更方便的移植到C++中来,建议养成强制转换的习惯。
第二、函数的实参为sizeof(int),用于指明一个整型数据需要的大小。
在Linux中可以有这样:malloc(0),这是因为Linux中malloc有一个下限值16Bytes,注意malloc(-1)是禁止的;但是在某些系统中是不允许malloc(0)的。
malloc只管分配内存,并不能对所得的内存进行初始化,所以得到的一片新内存中,其值将是随机的。
3、分别给出BOOL,int,float,指针变量与“零值”比较的if语句
BOOL型变量:if(!var)
int型变量:if(var==0)
float型变量:
constfloatEPSINON=0.00001;
if((x>;=-EPSINON)&;&;(x<;=EPSINON)
指针变量:if(var==NULL)
4、以下为WindowsNT下的32位C++程序,请计算sizeof的值
voidFunc(charstr[100])
{
sizeof(str)=?
}
void*p=malloc(100);
sizeof(p)=?
sizeof(str)=4
sizeof(p)=4
Func(charstr[100])函数中数组名作为函数形参时,在函数体内,数组名失去了本身的内涵,仅仅只是一个指针;在失去其内涵的同时,它还失去了其常量特性,可以作自增、自减等操作,可以被修改。
但是数组名在不作形参时,仍然代表整个数组,这时的sizeof应返回数组长度。
sizeof返回的单位是字节。对于结构体,sizeof返回可能会有字节填充。结构体的总大小为结构体最宽基本类型成员大小的整数倍。
5、写一个“标准”宏MIN,这个宏输入两个参数并返回较小的一个。另外,当你写下面的代码时会发生什么事?
least=MIN(*p++,b);
答案:
#defineMIN(A,B)((A)<;=(B)?(A)B))
四个注意点:
宏定义中,左侧为宏名和参数,右侧为宏的实现;
在宏的实现中,所有参数应用括号括起来;
整个宏的实现的外面也要用括号括起来;
最后没有分号。
写下如上代码会导致p自增两次。
|