来讲讲:12个风趣的C言语问答
系统做了些什么,这需要时间去掌握,(背命令不是一件好的学习方法,相信我你一定会在你背完之前全部忘光),尽量掌握常用命令;1,gets()办法
Q:以下代码有个被埋没住的成绩,你能找到它吗?
#include<stdio.h>intmain(void){charbuff;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;memset(passwd,0,sizeof(passwd));strcpy(passwd,argv);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,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:一个能承受恣意范例参数的办法像上面这个模样:
intfunc(void*ptr) 假如必要传送多个参数,那末我们能够传送一个包括这些参数的布局体
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;memset(passwd,0,sizeof(passwd));strcpy(passwd,argv);if(0==strcmp("LinuxGeek",passwd)){flag=1;}if(flag){printf("
Passwordcracked
");}else{printf("
Incorrectpasswd
");}return0;}011,部分变量的前往地点
Q:上面的代码有成绩吗?假如有,怎样修正?
#include<stdio.h>intmain(intargc,char*argv[]){intflag=0;charpasswd;memset(passwd,0,sizeof(passwd));strcpy(passwd,argv);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;memset(passwd,0,sizeof(passwd));strcpy(passwd,argv);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;memset(passwd,0,sizeof(passwd));strcpy(passwd,argv);if(0==strcmp("LinuxGeek",passwd)){flag=1;}if(flag){printf("
Passwordcracked
");}else{printf("
Incorrectpasswd
");}return0;}3 这是由于参数都是从右向左处置的,然后打印出来倒是从左向右。
英文原文:c-interview-questions
使用gcc或g++进行编译,使用gdb进行调试; 关于用类来控制C++的内存分配,应该算是C++的一个高级技法。写的好的C++程序,基本看不到delete与new。因为这些内存的分配,销毁都让一特殊的类去管理。 虽然还不明确软件技术包含的具体内容,但从C++语言这门课程开始,已发现程序设计的乐趣,在学习C++语言的过程中也学到了许多计算机应用基础知识,对计算机的机体也有了一个大体的了解。 最后一部分:算是高级一些的主题,总感觉书的这一部分翻译的不太好,读起来完全没有前面几章顺畅,像多重继承什么的,如果觉得太难理解,看的时候放一放,改天等你用到的时候,再来看看是怎么回事。 从2月21号开始看的,算下来已经1个多月了,每天看2-3个小时左右。本身C的基础挺好的,几本经典的C语言书都看过。 慢慢得,你会发现你得问题强人基本解决不了,不是你超过他,而是你们关注领域不同,这个时候,你自己也成为强人了,嘿嘿!! 只有全面撑握了这些东西. 然后你学了语法..就要经常锻炼 . 写不好没关系. 哪怕再小的程序.. 你写写改改
页:
[1]