狄大哲 发表于 2022-4-12 13:22:37

C++工程师常见的面试题总结

  面试中常见的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)

  {

  sizeof(str)=?

  }

  void*p=malloc(100);

  sizeof(p)=?

  sizeof(str)=4

  sizeof(p)=4

  Func(charstr)函数中数组名作为函数形参时,在函数体内,数组名失去了本身的内涵,仅仅只是一个指针;在失去其内涵的同时,它还失去了其常量特性,可以作自增、自减等操作,可以被修改。

  但是数组名在不作形参时,仍然代表整个数组,这时的sizeof应返回数组长度。

  sizeof返回的单位是字节。对于结构体,sizeof返回可能会有字节填充。结构体的总大小为结构体最宽基本类型成员大小的整数倍。

  5、写一个“标准”宏MIN,这个宏输入两个参数并返回较小的一个。另外,当你写下面的代码时会发生什么事?

  least=MIN(*p++,b);

  答案:

  #defineMIN(A,B)((A)<;=(B)?(A)B))

  四个注意点:

  宏定义中,左侧为宏名和参数,右侧为宏的实现;

  在宏的实现中,所有参数应用括号括起来;

  整个宏的实现的外面也要用括号括起来;

  最后没有分号。

  写下如上代码会导致p自增两次。
页: [1]
查看完整版本: C++工程师常见的面试题总结