华为C++笔试题及答案

array.push_back( 2 ); array.push_back( 3 );

// 删除array数组中所有的2

for( IntArray::iterator itor=array.begin(); itor!=array.end(); ++itor ) {

if( 2 == *itor ) array.erase( itor ); }

其实这里面隐藏着一个很严重的错误:当veci.erase(iter)之后,iter就变成了一个野指针,对一个野指针进行 iter++ 是肯定会出错的。

13. 写一个函数,完成内存之间的拷贝。[考虑问题是否全面] 答:

void* mymemcpy( void *dest, const void *src, size_t count ) {

char* pdest = static_cast( dest );

const char* psrc = static_cast( src );

if( pdest>psrc && pdest

{

for( size_t i=count-1; i!=-1; --I ) pdest[i] = psrc[i]; } else {

for( size_t i=0; i

return dest; }

int main( void ) {

char str[] = \ mymemcpy( str+1, str+0, 9 ); cout << str << endl;

system( \ return 0; }

本试题仅用于考查C++/C程序员的基本编程技能。内容限于C++/C常用语法,不涉及数据结构、算法以及深奥的语法。考试成绩能反映出考生的编程质量以及对C++/C的理解程度,但不能反映考生的智力和软件开发能力。

笔试时间90分钟。请考生认真答题,切勿轻视。

一、请填写BOOL , float, 指针变量 与“零值”比较的 if 语句。(10分)

提示:这里“零值”可以是0, 0.0 , FALSE或者“空指针”。例如 int 变量 n 与“零值”比较的 if 语句为:

if ( n == 0 ) if ( n != 0 ) 以此类推。

请写出 BOOL flag 与“零值”比较的 if 语句:

请写出 float x 与“零值”比较的 if 语句:浮点数是不可以直接比较大小的,因为是非精确存储,只能设置一个精度,然后在允许误差内的就认为是相等的;对浮点型数比较的时候用==是不对的

请写出 char *p 与“零值”比较的 if 语句:

二、以下为Windows NT下的32位C++程序,请计算sizeof的值(10分) char str[] = “Hello” ;6 char *p = str ;4 int n = 10;4 请计算

sizeof (str ) = sizeof ( p ) = sizeof ( n ) =

void Func ( char str[100]) {

请计算

sizeof( str ) = 4 }

void *p = malloc( 100 ); 请计算

sizeof ( p ) =4

三、简答题(25分)

1、头文件中的 ifndef/define/endif 干什么用?有两个C文件,这两个C文件都include了同一个头文件。而编译时,这两个C文件要一同编译成一个可运行文件,于是问题来了,大量的声明冲突。使用这个就不会造成重复定义。

2.在#ifndef中定义变量出现的问题(一般不定义在#ifndef中)。 #ifndef AAA #define AAA ... int i; ...

#endif

里面有一个变量定义

在vc中链接时就出现了i重复定义的错误,而在c中成功编译。 结论:

(1).当你第一个使用这个头的.cpp文件生成.obj的时候,int i 在里面定义了当另外一个使用这个的.cpp再次[单独]生成.obj的时候,int i 又被定义然后两个obj被另外一个.cpp也include 这个头的,连接在一起,就会出现重复定义.

(2).把源程序文件扩展名改成.c后,VC按照C语言的语法对源程序进行编译,而不是C++。在C语言中,若是遇到多个int i,则自动认为其中一个是定义,其他的是声明。

(3).C语言和C++语言连接结果不同,可能(猜测)时在进行编译的时候,C++语言将全局 变量默认为强符号,所以连接出错。C语言则依照是否初始化进行强弱的判断的。(参考)

.h中只声明 extern int i;在.cpp中定义 注意问题:

(1).变量一般不要定义在.h文件中。

2、#include 和 #include “filename.h” 有什么区别? 3、const 有什么用途?(请至少说明两种)

类型修饰符:定义常量,类型检查,保护被修饰符不被修改,const定义的常量在程序运行过程中只有一份拷贝,而#define定义的常量在内存中有若干个拷贝,#define给出的是立即数,#define定义的常量在内存中有若干个拷贝。

4、在C++ 程序中调用被 C编译器编译后的函数,为什么要加 extern “C”声明?

函数经过编译系统的翻译成汇编,函数名对应着汇编标号。因为C编译函数名与得到的汇编代号基本一样,如:fun()=>_fun, main=>_main但是C++中函数名与得到的汇编代号有比较大的差别。如:由于函数重载,函数名一样,但汇编代号绝对不能一样。为了区分,编译器会把函数名和参数类型合在一起作为汇编代号, 这样就解决了重载问题。具体如何把函数名和参数类型合在一起,要看编译器的帮助说明了。这样一来,如果C++调用C,如fun(),则调用名就不是C的翻译结果_fun,而是带有参数信息的一个名字,因此就不能调用到fun(),为了解决这个问题,加上extern \表示该函数的调用规则是C的规则,则调用时就不使用C++规则的带有参数信息的名字,而是_fun,从而达到调用C函数的目的。

5、请简述以下两个for循环的优缺点 // 第一个 for (i=0; i++;)

{ if (condition) DoSomething(); else DoOtherthing();} //优点: 缺点

第二个

if (condition){ for (i=0; i++;) DoSomething(); }else { for (i=0; i++;) DoOtherthing(); }

: 优点: 缺点:

四、有关内存的思考题(20分) void GetMemory(char *p) {

p = (char *)malloc(100);//没有free的操作肯定会造成内存泄漏 }

void Test(void) {

char *str = NULL; GetMemory(str);

strcpy(str, \printf(str); }

请问运行Test函数会有什么样的结果? 答:

char *GetMemory(void) {

char p[] = \存储在stack中,但是stack中的变量在完成function之后会自动释

放,所以也会返回一个野指针

return p; }

void Test(void) {

char *str = NULL; str = GetMemory(); printf(str); }

请问运行Test函数会有什么样的结果? 答:

Void GetMemory2(char **p, int num) {

*p = (char *)malloc(num); }

void Test(void) {

联系客服:779662525#qq.com(#替换为@) 苏ICP备20003344号-4