12个有趣的C语言面试题
摘要:12个C语言面试题,涉及指针、进程、运算、结构体、函数、内存,看看你能做出几个! 1.gets()函数
问:请找出下面代码里的问题:
- #include
- intmain(void)
- {
- charbuff[10];
- memset(buff,0,sizeof(buff));
- gets(buff);
- printf("\nThebufferenteredis[%s]\n",buff);
- return0;
- }
2.strcpy()函数
问:下面是一个简单的密码保护功能,你能在不知道密码的情况下将其破解吗?
- #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("\nPasswordcracked\n");
- }
- else
- {
- printf("\nIncorrectpasswd\n");
- }
- return0;
- }
- $./psswdaaaaaaaaaaaaa
- Passwordcracked
要避免这样的问题,建议使用 strncpy()函数。
作者注:最近的编译器会在内部检测栈溢出的可能,所以这样往栈里存储变量很难出现栈溢出。在我的gcc里默认就是这样,所以我不得不使用编译命令‘-fno-stack-protector’来实现上述方案。
3.main()的返回类型
问:下面的代码能 编译通过吗?如果能,它有什么潜在的问题吗?
- #include
- voidmain(void)
- {
- char*ptr=(char*)malloc(10);
- if(NULL==ptr)
- {
- printf("\nMallocfailed\n");
- return;
- }
- else
- {
- //Dosomeprocessing
- free(ptr);
- }
- return;
- }
4.内存泄露
问:下面的代码会导致内存泄漏吗?
- #include
- voidmain(void)
- {
- char*ptr=(char*)malloc(10);
- if(NULL==ptr)
- {
- printf("\nMallocfailed\n");
- return;
- }
- else
- {
- //Dosomeprocessing
- }
- return;
- }
提示:如果你想知道更多关于内存泄漏的知识和内存泄漏检测工具,可以来看看我们在Valgrind上的文章。
5.free()函数
问:下面的程序会在用户输入'freeze'的时候出问题,而'zebra'则不会,为什么?
- #include
- intmain(intargc,char*argv[])
- {
- char*ptr=(char*)malloc(10);
- if(NULL==ptr)
- {
- printf("\nMallocfailed\n");
- return-1;
- }
- elseif(argc==1)
- {
- printf("\nUsage\n");
- }
- else
- {
- memset(ptr,0,10);
- strncpy(ptr,argv[1],9);
- while(*ptr!='z')
- {
- if(*ptr=='')
- break;
- else
- ptr++;
- }
- if(*ptr=='z')
- {
- printf("\nStringcontains'z'\n");
- //Dosomemoreprocessing
- }
- free(ptr);
- }
- return0;
- }
6.使用_exit退出
问:在下面的代码中,atexit()并没有被调用,为什么?
- #include
- voidfunc(void)
- {
- printf("\nCleanupfunctioncalled\n");
- return;
- }
- intmain(void)
- {
- inti=0;
- atexit(func);
- for(; i<0xffffff; i++);
- _exit(0);
- }
7.void*和C结构体
问:你能设计一个能接受任何类型的参数并返回interger(整数)结果的函数吗?
答:如下:
- intfunc(void*ptr)
8.*和++操作
问:下面的操作会输出什么?为什么?
- #include
- intmain(void)
- {
- char*ptr="Linux";
- printf("\n[%c]\n",*ptr++);
- printf("\n[%c]\n",*ptr);
- return0;
- }
- [L]
- [i]
9.问:修改代码片段(或者只读代码)
问:下面的代码段有错,你能指出来吗?
- #include
- intmain(void)
- {
- char*ptr="Linux";
- *ptr='T';
- printf("\n[%s]\n",ptr);
- return0;
- }
10.会改变自己名字的进程
问:你能写出一个在运行时改变自己进程名的程序吗?
答:参见下面这段代码:
- #include
- intmain(intargc,char*argv[])
- {
- inti=0;
- charbuff[100];
- memset(buff,0,sizeof(buff));
- strncpy(buff,argv[0],sizeof(buff));
- memset(argv[0],0,strlen(buff));
- strncpy(argv[0],"NewName",7);
- //Simulateawait.Checktheprocess
- //nameatthispoint.
- for(; i<0xffffffff; i++);
- return0;
- }
问:下面代码有问题吗?如果有,该怎么修改?
- #include
- int*inc(intval)
- {
- inta=val;
- a++;
- return&a;
- }
- intmain(void)
- {
- inta=10;
- int*val=inc(a);
- printf("\nIncrementedvalueisequalto[%d]\n",*val);
- return0;
- }
12.处理printf()的参数
问:下面代码会输出什么?
- #include
- intmain(void)
- {
- inta=10,b=20,c=30;
- printf("\n%d..%d..%d\n",a+b+c,(b=b*2),(c=c*2));
- return0;
- }
- 110..40..60
推荐阅读
- 热闹中的孤独
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- 放屁有这三个特征的,请注意啦!这说明你的身体毒素太多
- 一个人的旅行,三亚
- 布丽吉特,人生绝对的赢家
- 慢慢的美丽
- 尽力
- 一个小故事,我的思考。
- 家乡的那条小河
- 《真与假的困惑》???|《真与假的困惑》??? ——致良知是一种伟大的力量