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
const char* psrc = static_cast
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) {