CC++常考面试题 1Word下载.docx
- 文档编号:15211406
- 上传时间:2022-10-28
- 格式:DOCX
- 页数:20
- 大小:24.65KB
CC++常考面试题 1Word下载.docx
《CC++常考面试题 1Word下载.docx》由会员分享,可在线阅读,更多相关《CC++常考面试题 1Word下载.docx(20页珍藏版)》请在冰豆网上搜索。
);
}
参考答案
字符串str1需要11个字节才能存放下(包括末尾的’\0’),而string只有10个字节的空间,strcpy会导致数组越界;
7
8
9
10
test2()
string[10],
str1[10];
int
i;
for(i=0;
i<
10;
i++)
str1
'
a'
首先,代码根本不能通过编译。
因为数组名str1为char*const类型的右值类型,根本不能赋值。
再者,即使想对数组的第一个元素赋值,也要使用*str1='
其次,对字符数组赋值后,使用库函数strcpy进行拷贝操作,strcpy会从源地址一直往后拷贝,直到遇到'
\0'
为止。
所以拷贝的长度是不定的。
如果一直没有遇到'
导致越界访问非法内存,程序就崩了。
完美修改方案为:
11
voidtest2()
charstring[10],str1[10];
inti;
i<
9;
i++)
str1[i]
=
str1[9]=
strcpy(string,str1);
指出下面代码有什么问题?
test3(char*
str1)
if(str1==NULL){
return;
if(
strlen(
)
<
10
)
if(strlen(str1)
10)应改为if(strlen(str1)
10),因为strlen的结果未统计’\0’所占用的1个字节。
写出完整版的strcpy函数
如果编写一个标准strcpy函数的总分值为10,下面给出几个不同得分的答案:
2分
*strDest,
*strSrc
while(
(*strDest++
*
strSrc++)
!
‘\0’
4分
const
//将源字符串加const,表明其为输入参数,加2分
7分
strcpy(char
*strSrc)
//对源地址和目的地址加非0断言,加3分
assert(
(strDest
NULL)
&
(strSrc
10分
//为了实现链式操作,将目的地址返回,加3分!
*address
strDest;
return
address;
检查下面代码有什么问题?
GetMemory(
*p
p
(char
*)
malloc(
100
Test(
*str
NULL;
str
str,
hello
world"
printf(
传入中GetMemory(
)函数的形参为字符串指针,在函数内部修改形参并不能真正的改变传入形参的值,执行完
后的str仍然为NULL;
下面代码会出现什么问题?
*GetMemory(
{
p[]
p;
GetMemory();
的p[]数组为函数内的局部自动变量,在函数返回后,内存已经被释放。
这是许多程序员常犯的错误,其根源在于不理解变量的生存期。
**p,
num
hello"
1.传入GetMemory的参数为字符串指针的指针,但是在GetMemory中执行申请内存及赋值语句
后未判断内存是否申请成功,应加上:
if
(
==
NULL
...//进行申请内存失败处理
2.未释放堆内存
3.printf(str)改为printf("
%s"
str),否则可使用格式化
字符串攻击
free(
...
//省略的其它语句
在执行
malloc(100);
后未进行内存是否申请成功的判断;
另外,在free(str)后未置str为空,导致可能变成一个“野”指针,应加上:
试题6的Test函数中也未对malloc的内存进行释放。
看看下面的一段程序有什么错误?
swap(
int*
p1,int*
p2
*p;
*p1;
*p1
*p2;
*p2
在swap函数中,p是一个“野”指针,有可能指向系统区,导致程序运行的崩溃。
在VC++中DEBUG运行时提示错误“Access
Violation”。
该程序应该改为:
分别给出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分。
以下为WindowsNT下的32位C++程序,请计算sizeof的值
Func
str[100]
sizeof(
?
sizeof
4
【剖析】
)函数中数组名作为函数形参时,在函数体内,数组名失去了本身的内涵,仅仅只是一个指针;
在失去其内涵的同时,它还失去了其常量特性,可以作自增、自减等操作,可以被修改。
数组名的本质如下:
(1)数组名指代一种数据结构,这种数据结构就是数组;
例如:
str[10];
cout
<<
sizeof(str)
endl;
输出结果为10,str指代数据结构char[10]。
(2)数组名可以转换为指向其指代实体的指针,而且是一个指针常量,不能作自增、自减等操作,不能被修改;
str++;
//编译出错,提示str不是左值
(3)数组名作为函数形参时,沦为普通指针。
Windows
NT
32位平台下,指针的长度(占用内存的大小)为4字节,故sizeof(
、sizeof
都为4。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- CC+常考面试题 CC 常考面 试题