|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
系统做了些什么,这需要时间去掌握,(背命令不是一件好的学习方法,相信我你一定会在你背完之前全部忘光),尽量掌握常用命令;
1,gets()办法
Q:以下代码有个被埋没住的成绩,你能找到它吗?- #include<stdio.h>intmain(void){charbuff[10];memset(buff,0,sizeof(buff));gets(buff);printf("
- Thebufferenteredis[%s]
- ",buff);return0;}
复制代码 A:这个不显眼的成绩就是利用了gets()办法。此办法承受一个string范例参数,可是却没有检测此数值是不是有充足的空间来拷贝数据。以是这里我们一样平常用fgets()办法未来的更好。
2,strcpy()办法
Q:暗码防护是很基础的功效,看看可否弄定上面这段代码?- #include<stdio.h>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
- ");}else{printf("
- Incorrectpasswd
- ");}return0;}
复制代码 3,main()办法的前往范例
Q:叨教上面这段代码可否经由过程编译?假如能的话,那末这段代码中隐含甚么成绩吗?- #include<stdio.h>voidmain(void){char*ptr=(char*)malloc(10);if(NULL==ptr){printf("
- Mallocfailed
- ");return;}else{//Dosomeprocessingfree(ptr);}return;}
复制代码 A:谜底是代码能经由过程编译,可是会留下针对main()办法的前往范例的告诫。main()办法的真正前往范例应当为int而非void。这是由于int前往范例可以让程序前往形态值。特别是当这段程序作为其他使用的从属程序时这个形态值将加倍主要。
4,内存保守
Q:叨教以下代码有内存保守吗?- #include<stdio.h>voidmain(void){char*ptr=(char*)malloc(10);if(NULL==ptr){printf("
- Mallocfailed
- ");return;}else{//Dosomeprocessing}return;}
复制代码 A:好,固然下面的代码没有对指针ptr举行内存开释,但实践上即便是程序停止也不会形成内存保守,由于当程序停止时一切一入手下手被占有的内存就全体清空了。但假如下面这段代码是在while轮回内里那将会形成严峻的成绩。
Note:假如你必要懂得更多关于内存保守的成绩和怎样利用工具检测内存保守,你能够参考这篇文章Valgrind
5,free()办法
Q:以下代码当用户输出freeze时会奔溃,而假如输出zebra则运转一般,这是为何?- #include<stdio.h>intmain(intargc,char*argv[]){char*ptr=(char*)malloc(10);if(NULL==ptr){printf("
- Mallocfailed
- ");return-1;}elseif(argc==1){printf("
- Usage
- ");}else{memset(ptr,0,10);strncpy(ptr,argv[1],9);while(*ptr!=z){if(*ptr==)break;elseptr++;}if(*ptr==z){printf("
- Stringcontainsz
- ");//Dosomemoreprocessing}free(ptr);}return0;}
复制代码 A:成绩的本源是由于代码在while轮回中改动了ptr指针的地点。当输出为zebra时,while轮回乃至在实行第一遍前就停止了,以是free()开释的内存地点就是一入手下手malloc()分派的地点。可是当输出freeze时,ptr纪录的地点在while轮回中被变动,由于将会是毛病的地点传送到free()办法中引发溃散。
6,atexitwith_exit
Q:在以下代码,atexit()办法并没有被挪用,你晓得为何吗?- #include<stdio.h>voidfunc(void){printf("
- Cleanupfunctioncalled
- ");return;}intmain(void){inti=0;atexit(func);for(;i<0xffffff;i++);_exit(0);}
复制代码 A:这是由于利用了_exit()办法。此办法并没有挪用扫除数据相干的办法,好比atexit()等。
7,void*与C布局体
Q:可否计划一个办法承受恣意范例的参数然后前往整数?同时是不是有举措传送多个如许的参数?
A:一个能承受恣意范例参数的办法像上面这个模样: 假如必要传送多个参数,那末我们能够传送一个包括这些参数的布局体
8,*与++操纵符
Q:以下代码将输入甚么?为何?- #include<stdio.h>intmain(void){char*ptr="Linux";printf("
- [%c]
- ",*ptr++);printf("
- [%c]
- ",*ptr);return0;}
复制代码 A:以上的输入将是: 由于++与*的优先级一样,以是*ptr++将会从右向左操纵。依照这个逻辑,ptr++会先实行然后实行*ptr。以是第一个了局是L。也由于++被实行了,以是下一个printf()了局是i。
9,MakingchangesinCodesegment
Q:以下代码运转时必定会溃散,你能说出缘故原由吗?- #include<stdio.h>intmain(void){char*ptr="Linux";*ptr=T;printf("
- [%s]
- ",ptr);return0;}
复制代码 A:这是由于,经由过程*ptr=T,此行代码实验变动只读内存存储的字符串Linux。此操纵固然行欠亨以是才会形成溃散。
10,Processthatchangesitsownname
Q:你可否写一个程序在它运转时修正它的称号?
A:以下代码能够完成- #include<stdio.h>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
- ");}else{printf("
- Incorrectpasswd
- ");}return0;}0
复制代码 11,部分变量的前往地点
Q:上面的代码有成绩吗?假如有,怎样修正?- #include<stdio.h>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
- ");}else{printf("
- Incorrectpasswd
- ");}return0;}1
复制代码 A:固然下面的代码偶然运转会很好,可是在办法inc()中有很严峻的隐患。当inc()办法实行后,再次利用部分变量的地点就会形成不成估计的了局。办理之道就是传送变量a的地点给main()。
12,处置printf()参数
Q:以下代码输入叨教是甚么?- #include<stdio.h>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
- ");}else{printf("
- Incorrectpasswd
- ");}return0;}2
复制代码 A:输入将是- #include<stdio.h>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
- ");}else{printf("
- Incorrectpasswd
- ");}return0;}3
复制代码 这是由于参数都是从右向左处置的,然后打印出来倒是从左向右。
英文原文:c-interview-questions
使用gcc或g++进行编译,使用gdb进行调试; |
|