您的位置:首页 > 编程语言 > C语言/C++

C/C++常考笔试面试题

2017-08-01 14:58 288 查看
1、分析下面代码有什么问题?

参考答案:字符串str1需要11个字节才能存放下(包括末尾的’\0’),而string只有10个字节的空间,strcpy会导致数组越界;

2、分析下面代码有什么问题?

参考答案:

1、代码根本不能通过编译。因为数组名str1为 char *const类型的右值类型,根本不能赋值。

2、数组名不能坐左值直接进行赋值,如果想对数组的第一个元素赋值,要使用 *str1 = 'a';

3、对字符数组赋值后,使用库函数strcpy进行拷贝操作,strcpy会从源地址一直往后拷贝,直到遇到'\0'为止。所以拷贝的长度是不定的。如果一直没有遇到'\0'导致越界访问非法内存,程序就崩了。

3、指出下面代码有什么问题?

参考答案:if(strlen(str1) <= 10)应改为if(strlen(str1) < 10),因为strlen的结果未统计’\0’所占用的1个字节。sizeof()会统计最后的\0,而strlen不会。

4、写出完整版的strcpy函数
如果编写一个标准strcpy函数的总分值为10,下面给出几个不同得分的答案:

2分

4分

7分

10分

//为了实现链式操作,将目的地址返回,加3分!

5、检查下面代码有什么问题?

参考答案:
传入中GetMemory( char *p )函数的形参为字符串指针,在函数内部修改形参并不能真正的改变传入形参的实参值,执行完

后的str仍然为NULL;

1:穿入形参并不能真正改变形参的值,执行完之后为空;

2:在函数GetMemory中和Test中没有malloc对应的free,造成内存泄露

6、下面代码会出现什么问题?

参考答案:

p[]数组为函数内的局部自动变量,在函数返回后,内存已经被释放。这是许多程序员常犯的错误,其根源在于不理解变量的生存期。

char p[]="hello world";相当于char p[12],strcpy(p," hello world" ).p是一个数组名,属于局部变量,存储在栈中, " hello world" 存储在文字存储区,数组p中存储的是 " hello world" 的一个副本,当函数结束,p被回收,副本也消失了(确切的说p指向的栈存储区被取消标记,可能随时被系统修改),而函数返回的p指向的内容也变得不确定,文字存储区的
" hello world" 未改变。可以这样修改: ①char* p= " hello world" ; return p; 这里p直接指向文字存储区的 " hello world" ,函数按值返回p存储的地址,所以有效。 ②static char p[]= " hello world" ; return p; static指出数组p为静态数组,函数结束也不会释放,所以有效。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: