欢迎来到天天文库
浏览记录
ID:45886178
大小:191.74 KB
页数:11页
时间:2019-11-19
《C语言面试题及答案》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、C语言面试题及答案 1.gets()函数 问:请找出下面代码里的问题: include intmain(void) { charbuff[10]; memset(buff,0,sizeof(buff)); gets(buff); printf(Thebufferenteredis[%s],buff); return0; } 答:上面代码里的问题在于函数gets()的使用这个函数从stdin接收一个字符串而不检查它所复制的缓存的容积这可能会导致缓存溢出这里推荐使用标准函数fgets()代替 2.str
2、cpy()函数 问:下面是一个简单的密码保护功能你能在不知道密码的情况下将其破解? include intmain(intargc,char*argv[]) { intflag=0; charpasswd[10]; memset(passwd,0,sizeof(passwd)); strcpy(passwd,argv[1]); if(0==strcmp(LinuxGeek,passwd)) { flag=1; } if(flag) { printf(Passwordcracked);
3、 } else { printf(Incorrectpasswd); } return0; } 答:破解上述加密的关键在于利用攻破strcpy()函数的漏洞所以用户在向“passwd”缓存输入随机密码的时候并没有提前检查“passwd”的容量是否足够所以如果用户输入一个足够造成缓存溢出并且重写“flag”变量默认值所存在位置的内存的长“密码”即使这个密码无法通过验证flag验证位也变成了非零也就可以获得被保护的数据了例如: $./psswdaaaaaaaaaaaaa Passwordcracked 虽然上面的密码并
4、不正确但我们仍然可以通过缓存溢出绕开密码安全保护 要避免这样的问题建议使用strncpy()函数 作者注:最近的编译器会在内部检测栈溢出的可能所以这样往栈里存储变量很难出现栈溢出在我的gcc里默认就是这样所以我不得不使用编译命令‘fnostackprotector’来实现上述方案 3.main()的返回类型 问:下面的代码能编译通过?如果能它有什么潜在的问题? include voidmain(void) { char*ptr=(char*)malloc(10); if(NULL==ptr) { printf(Ma
5、llocfailed); return; } else { //Dosomeprocessing free(ptr); } return; } 答:因为main()方法的返回类型这段代码的错误在大多数编译器里会被当作警告main()的返回类型应该是“int”而不是“void”因为“int”返回类型会让程序返回状态值这点非常重要特别当程序是作为依赖于程序成功运行的脚本的一部分运行时 4.内存泄露 问:下面的代码会导致内存泄漏? include voidmain(void) { char*
6、ptr=(char*)malloc(10); if(NULL==ptr) { printf(Mallocfailed); return; } else { //Dosomeprocessing } return; } 答:尽管上面的代码并没有释放分配给“ptr”的内存但并不会在程序退出后导致内存泄漏在程序结束后所有这个程序分配的内存都会自动被处理掉但如果上面的代码处于一个“while循环”中那将会导致严重的内存泄漏问题 提示:如果你想知道更多关于内存泄漏的知识和内存泄漏检测工具可以来看看我们在Val
7、grind上的文章 5.free()函数 问:下面的程序会在用户输入’freeze’的时候出问题而’zebra’则不会为什么? include intmain(intargc,char*argv[]) { char*ptr=(char*)malloc(10); if(NULL==ptr) { printf(Mallocfailed); return1; } elseif(arg
此文档下载收益归作者所有