创维笔试题目Word文档格式.docx
《创维笔试题目Word文档格式.docx》由会员分享,可在线阅读,更多相关《创维笔试题目Word文档格式.docx(7页珍藏版)》请在冰豆网上搜索。
=”此类形式。
请写出char*p与“零值”比较的if语句。
if(p==null)
if(p!
=null)
二、以下为windowsnt下的32位c++程序,请计算sizeof的值(10分)
charstr[]=“hello”;
char
*p=str;
intn=10;
请计算
sizeof(str)=6(2分)
sizeof(p)=4(2分)
sizeof(n)=4
voidfunc(charstr[100])
{
sizeof(str)=4(2分)
}
void*p=malloc(100);
三、简答题(25分)
1、头文件中的ifndef/define/endif干什么用?
(5分)
答:
防止该头文件被重复引用。
2、#include<
filename.h>
和#include“filename.h”有什么区别?
对于#include<
,编译器从标准库路径开始搜索filename.h
对于#include
“filename.h”,编译器从用户的工作路径开始搜索filename.h
3、const有什么用途?
(请至少说明两种)(5分)
(1)可以定义const常量
(2)const可以修饰函数的参数、返回值,甚至函数的定义体。
被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。
4、在c++程序中调用被c编译器编译后的函数,为什么要加extern“c”?
(5分)
c++语言支持函数重载,c语言不支持函数重载。
函数被c++编译后在库中的名字与c语言的不同。
假设某个函数的原型为:
voidfoo(intx,inty);
该函数被c编译器编译后在库中的名字为_foo,而c++编译器则会产生像_foo_int_int之类的名字。
c++提供了c连接交换指定符号extern“c”来解决名字匹配问题。
四、有关内存的思考题(每小题5分,共20分)
一.
voidgetmemory(char*p)
p=(char*)malloc(100);
voidtest(void)
char*str=null;
getmemory(str);
strcpy(str,"
helloworld"
);
printf(str);
请问运行test函数会有什么样的结果?
试题传入getmemory(char*p)函数的形参为字符串指针,在函数内部修改形参并不能真正的改变传入形参的值,执行完char*str=null;
getmemory(str);
后的str仍然为null;
二.
char*getmemory(void)
charp[]="
;
returnp;
str=getmemory();
可能是乱码。
charp[]="
的p[]数组为函数内的局部自动变量,在函数返回后,内存已经被释放。
这是许多程序员常犯的错误,其根源在于不理解变量的生存期。
三.
voidgetmemory2(char**p,intnum)
p=(char*)malloc(num);
getmemory(&
str,100);
hello"
(1)能够输出hello
(2)test函数中也未对malloc的内存进行释放。
(3)getmemory避免了试题1的问题,传入getmemory的参数为字符串指针的指针,但是在getmemory中执行申请内存及赋值语句
p=(char*)malloc(num);
后未判断内存是否申请成功,应加上:
if(*p==null){
}
四.
char*str=(char*)malloc(100);
strcpy(str,“hello”);
free(str);
if(str!
=null)
{
strcpy(str,“world”);
执行char*str=(char*)malloc(100);
后未进行内存是否申请成功的判断;
另外,在free(str)后未置str为空,导致可能变成一个“野”指针,应加上:
str=null;
五、编写strcpy函数(10分)
已知strcpy函数的原型是
char*strcpy(char*strdest,constchar*strsrc);
其中strdest是目的字符串,strsrc是源字符串。
(1)不调用c++/c的字符串库函数,请编写函数strcpy
char*strcpy(char*strdest,constchar*strsrc);
assert((strdest!
=null)&
(strsrc!
=null));
//2分
char*address=strdest;
while((*strdest++=*strsrc++)!
=‘/0’)
null;
returnaddress;
(2)strcpy能把strsrc的内容复制到strdest,为什么还要char*类型的返回值?
为了实现链式表达式。
//2分
例如intlength=strlen(strcpy(strdest,“helloworld”));
六、编写类string的构造函数、析构函数和赋值函数(25分)
已知类string的原型为:
classstring
{
public:
string(constchar*str=null);
//普通构造函数
string(conststring&
other);
//拷贝构造函数
~string(void);
//析构函数
string&
operate=(conststring&
//赋值函数
private:
char
*m_data;
//用于保存字符串
};
请编写string的上述4个函数。
标准答案:
//string的析构函数
string:
:
~string(void)
//3分
delete[]m_data;
//由于m_data是内部数据类型,也可以写成deletem_data;
}
//string的普通构造函数
string(constchar*str)
//6分
if(str==null)
m_data=newchar[1];
//若能加null判断则更好
*m_data=‘/0’;
}
else
intlength=strlen(str);
m_data=newchar[length+1];
//若能加null判断则更好
strcpy(m_data,str);
//拷贝构造函数
other)
{
intlength=strlen(other.m_data);
//若能加null判断则更好
strcpy(m_data,other.m_data);
//赋值函数
string&
perate=(conststring&
//13分
//
(1)检查自赋值
//4分
if(this==&
other)
return*this;
//
(2)释放原有的内存资源//3分
//(3)分配新的内存资源,并复制内容//3分
//若能加null判断则更好
//(4)返回本对象的引用
return*this;
}