12个有趣的C语言面试题
作者:网络转载 发布时间:[ 2012/9/7 9:56:58 ] 推荐标签:面试
5、free()函数
问:下面的程序会在用户输入'freeze'的时候出问题,而'zebra'则不会,为什么?
#include<stdio.h>
int main(int argc, char *argv[])
{
char *ptr = (char*)malloc(10);
if(NULL == ptr)
{
printf("
Malloc failed
");
return -1;
}
else if(argc == 1)
{
printf("
Usage
");
}
else
{
memset(ptr, 0, 10);
strncpy(ptr, argv[1], 9);
while(*ptr != 'z')
{
if(*ptr == '')
break;
else
ptr++;
}
if(*ptr == 'z')
{
printf("
String contains 'z'
");
// Do some more processing
}
free(ptr);
}
return 0;
}
答:这里的问题在于,代码会(通过增加“ptr”)修改while循环里“ptr”存储的地址。当输入“zebra”时,while循环会在执行前被终止,因此传给free()的变量是传给malloc()的地址。但在“freeze”时,“ptr”存储的地址会在while循环里被修改,因此导致传给free()的地址出错,也导致了seg-fault或者崩溃。
6、使用_exit退出
问:在下面的代码中,atexit()并没有被调用,为什么?
#include<stdio.h>
void func(void)
{
printf("
Cleanup function called
");
return;
}
int main(void)
{
int i = 0;
atexit(func);
for(;i<0xffffff;i++);
_exit(0);
}
这是因为_exit()函数的使用,该函数并没有调用atexit()等函数清理。如果使用atexit()应当使用exit()或者“return”与之相配合。

sales@spasvo.com