C/C++ 笔试、面试题目大汇总2 - CSDN博客
文章推薦指數: 80 %
C/C++ 笔试、面试题目大汇总2 ... 对试题2,如果面试者指出字符数组str1不能在数组内结束可以给3分;如果面试者指出strcpy(string,str1)调用使得 ...
C/C++笔试、面试题目大汇总2
海底小星星
于 2018-05-1413:20:14 发布
123
收藏
1
分类专栏:
面试
面试
专栏收录该内容
37篇文章
0订阅
订阅专栏
继续~~~~~~~~~
一.找错题
试题1:
void
test1(){
char
string
[
10
];
char
*
str1
=
"
0123456789
"
; strcpy(
string
,str1);}
试题2:
void
test2(){
char
string
[
10
],str1[
10
];
int
i;
for
(i
=
0
;i
<
10
;i
++
) { str1
=
'
a
'
; } strcpy(
string
,str1);}
试题3:
void
test3(
char
*
str1){
char
string
[
10
];
if
(strlen(str1)
<=
10
) { strcpy(
string
,str1); }}
解答: 试题1字符串str1需要11个字节才能存放下(包括末尾的’\0’),而string只有10个字节的空间,strcpy会导致数组越界;
对试题2,如果面试者指出字符数组str1不能在数组内结束可以给3分;如果面试者指出strcpy(string,str1)调用使得从str1内存起复制到string内存起所复制的字节数具有不确定性可以给7分,在此基础上指出库函数strcpy工作方式的给10分;
对试题3,if(strlen(str1)<=10)应改为if(strlen(str1)<10),因为strlen的结果未统计’\0’所占用的1个字节。
剖析: 考查对基本功的掌握: (1)字符串以’\0’结尾; (2)对数组越界把握的敏感度; (3)库函数strcpy的工作方式,如果编写一个标准strcpy函数的总分值为10,下面给出几个不同得分的答案:
试题4:
void
GetMemory(
char
*
p){ p
=
(
char
*
)malloc(
100
);}
void
Test(
void
) {
char
*
str
=
NULL; GetMemory(str); strcpy(str,
"
helloworld
"
); printf(str);}
试题5:
char
*
GetMemory(
void
){
char
p[]
=
"
helloworld
"
;
return
p; }
void
Test(
void
){
char
*
str
=
NULL; str
=
GetMemory(); printf(str); }
试题6:
void
GetMemory(
char
**
p,
int
num){
*
p
=
(
char
*
)malloc(num);}
void
Test(
void
){
char
*
str
=
NULL; GetMemory(
&
str,
100
); strcpy(str,
"
hello
"
); printf(str); }
试题7:
void
Test(
void
){
char
*
str
=
(
char
*
)malloc(
100
); strcpy(str,
"
hello
"
); free(str); ...
//
省略的其它语句
}
解答: 试题4传入中GetMemory(char*p)函数的形参为字符串指针,在函数内部修改形参并不能真正的改变传入形参的值,执行完
char*str=NULL;GetMemory(str); 后的str仍然为NULL;
试题5中charp[]="helloworld"; returnp; 的p[]数组为函数内的局部自动变量,在函数返回后,内存已经被释放。
这是许多程序员常犯的错误,其根源在于不理解变量的生存期。
试题6的GetMemory避免了试题4的问题,传入GetMemory的参数为字符串指针的指针,但是在GetMemory中执行申请内存及赋值语句
*p=(char*)malloc(num);后未判断内存是否申请成功,应加上:
if(*p==NULL){ ...//进行申请内存失败处理}
试题7存在与试题6同样的问题,在执行char*str=(char*)malloc(100); 后未进行内存是否申请成功的判断;另外,在free(str)后未置str为空,导致可能变成一个“野”指针,应加上:
str=NULL;
试题6的Test函数中也未对malloc的内存进行释放。
剖析: 试题4~7考查面试者对内存操作的理解程度,基本功扎实的面试者一般都能正确的回答其中50~60的错误。
但是要完全解答正确,却也绝非易事。
对内存操作的考查主要集中在:1)指针的理解;
2)变量的生存期及作用范围;3)良好的动态内存申请和释放习惯。
再看看下面的一段程序有什么错误:
swap(
int
*
p1,
int
*
p2){
int
*
p;
*
p
=
*
p1;
*
p1
=
*
p2;
*
p2
=
*
p;}
在swap函数中,p是一个“野”指针,有可能指向系统区,导致程序运行的崩溃。
在VC++中DEBUG运行时提示错误“AccessViolation”。
该程序应该改为:
swap(
int
*
p1,
int
*
p2){
int
p; p
=
*
p1;
*
p1
=
*
p2;
*
p2
=
p;}
二.内功题
试题1:分别给出BOOL,int,float,指针变量与“零值”比较的if语句(假设变量名为var)
解答:
BOOL型变量:if(!var)
int型变量:if(var==0)
float型变量:
constfloatEPSINON=0.00001;
if((x>=-EPSINON)&&(x<=EPSINON)
指针变量: if(var==NULL)
剖析:
考查对0值判断的“内功”,BOOL型变量的0判断完全可以写成if(var==0),而int型变量也可以写成if(!var),指针变量的判断也可以写成if(!var),上述写法虽然程序都能正确运行,但是未能清晰地表达程序的意思。
一般的,如果想让if判断一个变量的“真”、“假”,应直接使用if(var)、if(!var),表明其为“逻辑”判断;如果用if判断一个数值型变量(short、int、long等),应该用if(var==0),表明是与0进行“数值”上的比较;而判断指针则适宜用if(var==NULL),这是一种很好的编程习惯。
浮点型变量并不精确,所以不可将float变量用“==”或“!=”与数字比较,应该设法转化成“>=”或“<=”形式。
如果写成if(x==0.0),则判为错,得0分。
试题2:以下为WindowsNT下的32位C++程序,请计算sizeof的值
void
Func(
char
str[
100
]){
sizeof
(str)
=
?
}
void
*
p
=
malloc(
100
);
sizeof
(p)
=
?
解答:
sizeof(str)=4sizeof(p)=4剖析:
Func(charstr[100])函数中数组名作为函数形参时,在函数体内,数组名失去了本身的内涵,仅仅只是一个指针;在失去其内涵的同时,它还失去了其常量特性,可以作自增、自减等操作,可以被修改。
数组名的本质如下:(1)数组名指代一种数据结构,这种数据结构就是数组;
例如:
charstr[10];cout<
charstr[]="hello";
char*p1=str;
intn=10;
sizeof(str)=?
sizeof(str)=?
sizeof(str)=?
voidFunc(chars[100])
{
sizeof(s)=?
延伸文章資訊
- 1C/C++ 笔试、面试题目大汇总
C/C++ 笔试、面试题目大汇总 ... 因此,当参数传递的数据较大时,用引用比用一般变量传递参数的效率和所占空间都好。 (3)使用指针作为函数的参数 ...
- 2C/C++ 笔试、面试题目大汇总 - CSDN博客
这些东西有点烦,有点无聊。如果要去C++面试就看看吧。几年前网上搜索的。刚才看到,就整理一下,里面有些被我改了,感觉之前说的不对或不完善。 1.
- 3C/C++ 筆試、面試題目大匯總(三) - Alibaba Cloud Topic Center
- 4C/C++筆試、面試題目大匯總(一) (轉貼) - 程式筆記本
C/C++筆試、面試題目大匯總(一) (轉貼). 原文: http://goodfish.blog.hexun.com.tw/7601245_d.html 1.求下面函數的返回值(微軟) int...
- 5C++ C++ 筆試面試題目大匯總、c題庫 - 房產建案資訊懶人包
C++ C++ 筆試面試題目大匯總在PTT/mobile01評價與討論, 提供c題庫、C 筆試、C++ 筆試就來房產建案資訊懶人包,有最完整C++ C++ 筆試面試題目大匯總體驗分享訊息.