…… //省略的其它语句 } 解答: 试题 4 传入中 GetMemory( char *p )函数的形参为字符串指针,在函数内部修改形参并 不能真正的改变传入形参的值,执行完 char *str = NULL; GetMemory( str ); 后的 str 仍然为 NULL; 试题 5 中 char p[] = "hello world"; return p; 的 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 运行时提示错误"Access Violation" .该程序应该改为: swap( int* p1,int* p2 ) { int p; p = *p1; *p1 = *p2; *p2 = p; } 3.内功题 试题 1:分别给出 BOOL,int,float,指针变量 与"零值"比较的 if 语句(假
设变量 名为 var) 解答: BOOL 型变量:if(!var)
int 型变量: if(var==0) float 型变量: const float EPSINON = 0.00001; if ((x >= - EPSINON) &;&; (x <= EPSINON) 指针变量: 剖析: 考查对 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:以下为 Windows NT 下的 32 位 C++程序,请计算 sizeof 的值 void Func ( char str[100] ) { sizeof( str ) = ? } void *p = malloc( 100 ); sizeof ( p ) = ? 解答: sizeof( str ) = 4 sizeof ( p ) = 4 剖析: Func ( char str[100] )函数中数组名作为函数形参时,在函数体内,数组名失去了本身的 内涵,仅仅只是一个指针;在失去其内涵的同时,它还失去了其常量特性,可以作自增,自 if(var==NULL)
减等操作,可以被修改. 数组名的本质如下: (1)数组名指代一种数据结构,这种数据结构就是数组; 例如: char str[10]; cout << sizeof(str) << endl; 输出结果为 10,str 指代数据结构 char[10]. (2)数组名可以转换为指向其指代实体的指针,而且是一个指针常量,不能作自增, 自减等操作,不能被修改; char str[10]; str++; //编译出错,提示 str 不是左值 (3)数组名作为函数形参时,沦为普通指针. Windows NT 32 位平台下,指针的长度(占用内存的大小)为 4 字节,故 sizeof( str ) , sizeof ( p ) 都为 4. 试题 3:写一个"标准"宏 MIN,这个宏输入两个参数并返回较小的一个.另外,当你 写下面的代码时会发生什么事? least = MIN(*p++, b); 解答: #define MIN(A,B) ((A) <= (B) ? (A) : (B)) MIN(*p++, b)会产生宏的副作用 剖析: 这个面