c、c笔试题,面试题.pdf
C、C+笔试题,面试题很少有真正精通了C语言编程的学员,一般都有或多或少概念不是完全清楚的问题,特别是一些需要丰富的实战经验才能体会和明白的问题,如字符串,指针,类型转换,定义指向函数的指针类型,这也是导致学习C困难的一个原因。下面有几个简单测试招能发现你 对 C语言的掌握情况。1)int x=3 5;char str 1 0 ;/问:strlen(str)和 siz eof(str)的值分别是多少?答:strlen(str)值不确定,strlen根据 0 确定字符串是否结束。siz eof(str)=1 0 siz eof 一 个数组为数组长度strcpy (str,it3 1 5.org”/*共 1 3 个字母*/);问:此 时 x 和 strlen(str)的值分别是多少?答:x 为 3 5strcpy(char*dest,const char*src)根 据 src来复制dest,依 照 src的 0 决定复制的长度,而dest必须要提供足够的长度,这里会引起溢出,strlen返 回 1 3,但是数组外部的数据己经被破坏strlen的值为1 3,在 V C+环境下,x 的值是要改变的(其他编译器下没试,).虽然表面上看来,在程序中并没有修改x 的值,但是实际运行的结果是上面的x 的值发生了修改,这是因 为 strcpy 以后,把多余的数据拷贝进了 str的邻居(int类型的x)中,所 以 x 的数据也就变了.这是一个曾让我刻骨铭心的问题,在我刚出道时遇到这个问题,虽然在朋友的帮助下解决了这个问题,但一直不明白x 的值为何变了,只有最后走上培训教师的岗位,才开始梳理自己曾经的困惑,才开始总结以前的经验供学员们借鉴.我觉得这个题目的价值非常之大,它能引起学员对字符串拷贝越界问题的足够重视,并且通过这个问题更能明白字符串的处理是怎么回时,更能明白字符串与字符数组的关系:字符串就是一个字符数组,只是把这个字符数组用在处理串的函数中时,这些函数不考虑数组的长度,只是记住数组的首地址,从首地址开始处理,并在遇到0时结束处理,3)char s t r 1 0;s t r=it 31 5.o r g;/als o can u s e:m em cp y(s t r,“it 31 5.o r g)编译能通过吗?答:数组不能赋值,只能初始化。char s t r 1 0 =it 31 5.o r g;而且初始化时编译器会检查数组的长度与初始化串的长度是否匹配4)char *p s t r;s t r cp y (p s t r,,zit 31 5.o r g);需要初始化并分配空间上句编译能通过吗?运行时有问题吗?答:可以通过编译,但 是 p s t r 指向了常量区,运行时最好只做读操作,写操作不保险。编译可以通过,但是p s t r 没有进行有效的初始化,它指向了一个不确定的内存区,运行时会出现内存不可写错误!co n s t char *p l;char *co n s t p 2;co n s t 指针必须初始化上面两句有什么区别吗?答:co n s t char*和 char co n s t*一样,都是表示指向常量的字符指针。char *co n s t 表示指向字符的常量指针p l=(co n s t char *)s t r;如果是p l=s t r;编译能够通过吗?明白为什么要类型转换?类型转换的本质是什么?答:可以通过编译。关于常量与非常量指针的关系是这样的:co n s t 指针可以指向co n s t 或者非co n s t 区域,不会造成什么问题。非 co n s t 指针不能指向co n s t 区域,会引起错误。(呵呵,这个问题,很经典)s t r cp y (p l,abc);编译能够通过吗?答:不能通过,s t r cp y (char*,co n s t char*);char*不能指向 co n s t char*注意:非 co n s t 指针不能指向co n s t 区域,会引起错误。p r in t f(%d,s t r);有问题吗?答:没有问题,输出的是s t r 的地址信息C har *p s t r;p s t r=30 0 0;编译能过吗?如果不行,该如何修改以保证编译通过呢?答:不能通过,char*p s t r 表示p s t r 是个字符指针,不能指向30 0 0 的整形变量。修改的话,可以这样:p s t r =(char*)30 0 0,把 p s t r 指 向 30 0 0 这个地址;lo n g y=(lo n g)p s t r;可以这样做吗?答:可以,y的值为p s t r 所指的地址。不过如果是纯粹要地址的话,最好是用u n s ign ed lo n g。in t *p=s t r;*p=0 x 0 0 31 32 0 0;p r in t f(%s”,s t r);会是什么效果?提示0 x 31 对应字符 1 ,0 x 32 对应字符 2 。答:首先编译未必会过关,有些编译器可能不允许in t *直接指向char*。最好是改为 in t *p =(in t*)s t r;过关了效果就是什么东西都没有。in t *p=s t r;p为 s t r 所指的地址,*p 表示修改了s t r 所指向的内存。由于s iz eo f(in t)在 32 位机上,in t 有 4个字节(其实具体要看编译器的配置文件,好像 是 lim it.h,一般 是 4个字节)所以修改了 s t r 0-str 3 由于0 x 0 0 3 13 2 0 0 头尾都是0,所以字符串为 0 开头,什么都打印不出来。这里有个B i g-en di n 和 l i ttl e-en di n 的问题。以 0 x 3 13 2 3 3 3 4 为例l i ttl e-en di n 的机器上面,0 x 3 13 2 3 3 3 4 在内存中排列顺序为3 4 3 3 3 2 3 1,输出为4 3 2 1,如 INTEL芯片的p cbi g-en di n 机器上面为 3 1 3 2 3 3 3 4 ,输出为 12 3 4,如 IB M POWERPCp=3 0 0 0;/p+l 的结果会是多少?答:3 0 0 0+si z eo f(i n t);指针+1均为原来地址加上si z eo f (指针所指的数据类型)ch ar*p c=n ew ch ar 10 0 ;上述语句在内存中占据儿个内存块,怎样的布局情况?答:本身p c会占用函数栈一个4字节的指针长度(具体是否为4个字节要看机器和编译 器)。n ew 会在堆上申请10 0 个字节si z eo f (ch ar)的连续空间。v o i d test(ch ar*p)*p=n ew ch ar 10 0 ;/这个编译函数有问题吗?外面要调用这个函数,该怎样传递参数?答:该程序没有问题。需要在函数中对指针所指的地址进行变化是必须传入指针的地址。原因是这样的:如果传入的为指针本身,在函数调用的时候,实参会被复制一个实例,这样就不是原来的指针了,对该指针本身进行的任何改变都不能传递回去了。可以这样理解,如果传入的参数为i n t,那么对i n t本身的值的改变就传不回去啦,加个*也是一样的。能明白ty p edef i n t(*PFUN)(i n t x,i n t y)及其作用吗?答:定义了一个函数指针类型的宏,这 样 PFUN就表示指向返回值为i n t,且同时带2个i n t参数的函数指针类型了。可以用来定义这样的变量:比如有个函数为i n t f u n(i n t x,i n t y ):PFUN p =f u n;补充:函数指针最大的用处在于它可以被一个模板方法调用,这是我在学j av a的设计模式日领悟到的.例如,有两个函数的流程结构完全一致,只是内部调用的具体函数不同,如下 所 示:v o i d f u n d()(一段流程代码和面向方面的代理,如安全检查,日志记录等i n t s u m =a d d(x ,y);一段流程代码和面向方面的代理,如安全检查,日志记录等)v o i d f u n c 2()(与 f u n c l 完全相同的一段流程代码和面向方面的代理,如安全检查,日志记录等i n td i f f e r e n c e =s u b(x ,y);与 f u n c l 完全相同的段流程代码和面向方面的代理,如安全检查,日志记录等那么,可以只定义一个函数,如下所示v o i d f u n c(P FU N C p)/与fu n d完全相同的一段流程代码和面向方面的代理,如安全检查,日志记录等intdifference=p(x,y);与funcl完全相同的一段流程代码和面向方面的代理,如安全检查,日志记录等调用程序在调用时,让参数p分别指向add和sub函数就可以了.以下是腾讯的笔试面试题:请定义一个宏,比较两个数a、b的大小,不能使用大于、小于、i f语句2、如何输出源文件的标题和目前执行行的行数3、两个数相乘,小数点后位数没有限制,请写一个高精度算法4、写一个病毒5、有A、B、C、D四个人,要在夜里过一座桥。他们通过这座桥分别需要耗时1、2、5、10分钟,只有一支手电,并且同时最多只能两个人一起过桥。请问,如何安排,能够在17分钟内这四个人都过桥?2008年腾讯招聘选择题(60)c/c+os linux方面的基础知识c的Sizeof函数有好几个!程序填空(40)1.(20)4 空 x5不使用额外空间,将A,B两链表的元素交叉归并2.(20)4 空 x5MFC将树序列化转存在数组或链表中!1,计 算a*b 2(运算符优先级问题)2根据先序中序求后序3 a3 4哪个不能表示 al 1:*(&a0 0)*(*(a+l)+l)*(&al+l)*(&a0 0+4)4 f o r(i n t i.)f o r(i n t j.)p r i n t f (i,j);p r i n t f (j)会由现什么问题5 f o r(i=0;i -123main()if(*s t ring=)n=1;els en=nu m(s t ring);int nu m(c har*s t ring)for(;!(*s t ring=0);s t ring+)int k;k 二 _2;j=-s L en;w hile(_3_)k =k *10;nu m=nu m+k;ret u rn nu m;)附加题:1 linu x下调试c ore的命令,察看堆栈状态命令2 写 出 s oc k s 套接字服务端客户端通讯程序3 填空补全程序,按照我的理解是添入:W in32调 入 dll的函数名查找函数入口的函数名找到函数的调用形式把 formV iew 加 到 s ingledoc 的声明 将 s ingledoc 加到app的声明4 有关系 s (s no,s name)c (eno,c name)s c (s no,eno,grade)1 问上课程曲的学生no2 成绩最高的学生号3 每科大于90 分的人数主要是C/C+、数据结构、操作系统等方面的基础知识。好像有s iz eof、树等选择题。填空题是补充完整程序。附加题有写算法的、编程的、数据库s q l语句查询的。还有一张开放性问题。请定义一个宏,比较两个数a、b 的大小,不能使用大于、小于、if语 句#defineM ax(a,b)(a/b)?a:b如何输出源文件的标题和目前执行行的行数int line=L I N E;c har*file=_F I L E_;c ou t z file name is /z(file),z,line is line endl;两个数相乘,小数点后位数没有限制,请写一个高精度算法写一个病毒w h i l e (1)(i n t *p =n e w i n t 1 0 0 0 0 0 0 0 ;)不使用额外空间,将 A,B两链表的元素交叉归并将树序列化转存在数组或 链表中s t r u c t s t i n t i;s h o r t s;c h a r c;);s i z e o f (s t r u c t s t);8c h a r *p l;v o i d *p 2;i n t p 3;c h a r p 4 1 0 ;s i z e o f(p l.p 4)=?4,4,4,1 0二分查找快速排序双向链表的删除结点有 1 2 个小球,外形相同,其中一个小球的质量与其他1 1 个不同给一个天平,问如何用3次把这个小球找出来并且求出这个小球是比其他的轻还是重解答:哈哈,据说这是微软前几年的一个面试题。很经典滴啊!三次一定能求出来,而且能确定是重还是轻。数据结构的知识还没怎么学透,不过这个题我到是自己研究过,可以分析下。将 1 2 个球分别编号为 a l,a 2,a 3.a l O,a l l,a l 2.第一步:将 1 2 球分开3拨,每 拨 4个,a l a 4 第一拨,记 为 b l,a 5 a 6 第 2拨,记为b 2,其余第3 拨,记为b 3;第二步:将 b l 和 b 2 放到天平两盘上,记左盘为c l,右 为 c 2;这时候分两中情况:l.c l 和 c 2 平衡,此时可以确定从a l 到 a 8 都是常球;然后把c 2 拿空,并从c l 上拿下a 4,从 a 9 到 a l 2 四球里随便取三球,假设为a 9 到 a l l,放 到 c2上。此 时 c l 上是a l 到a 3,c 2 上 是 a 9 到 a l l。从这里又分三种情况:A:天平平衡,很简单,说明没有放上去的a l 2 就是异球,而到此步一共称了两次,所以将a l 2 随便跟1 1 个常球再称一次,也就是第三次,马上就可以确定a l 2 是重还是轻;B:若 c l 上升,则这次称说明异球为a 9 到 a l l 三球中的一个,而且是比常球重。取下c l 所有的球,并将a 8 放 到 c l 上,将 a 9 取下,比较a 8 和 a l l (第三次称),如果平衡则说明从c 2 上取下的a 9 是偏重异球,如果不平衡,则偏向哪盘则哪盘里放的就是偏重异球;C:若 c l 下降,说明a 9 到 a l l 里有一个是偏轻异球。次种情况和B类似,所以接下来的步骤照搬B就是;2.c l 和 c 2 不平衡,这时候又分两种情况,c l 上升和c l 下降,但是不管哪种情况都能说明a 9 到 a l 2 是常球。这步是解题的关键。也是这个题最妙的地方。A:cl卜 一 升,此时不能判断异球在哪盘也不能判断是轻还是重。取 下 c l 中的a 2 到 a 4 三球放一边,将 c 2 中的a 5 和 a 6 放 到 c l 上,然后将常球a 9 放 到 c 2 上。至此,c l 上是a l,a 5 和 a 6,c 2 上 是 a 7,a 8 和 a 9。此时又分三中情况:1)如果平衡,说明天平上所有的球都是常球,异球在从c l 上取下a 2 到 a 4 中。而且可以断定异球轻重。因为a 5 到 a 8 都是常球,而第2次称的时候c l 是上升的,所 以 a 2 到 a 4里必然有一个轻球。那么第三次称就用来从a 2 到 a 4 中找到轻球。这很简单,随便拿两球放 到 c l 和 c 2,平衡则剩余的为要找球,不平衡则哪边低则哪个为要找球;2)c l 仍然保持上升,则说明要么a l 是要找的轻球,要 么 a 7 和 a 8 两球中有一个是重球(这步懂吧?好好想想,很简单的。因为a 9 是常球,而取下的a 2 到 a 4 肯定也是常球,还可以推出换盘放置的a 5 和 a 6也是常球。所以要么a l 轻,要 么 a 7 或 a 8 重)。至此,还剩一次称的机会。只需把a 7 和 a 8 放上两盘,平衡则说明a l 是要找的偏轻异球,如果不平衡,则哪边高说明哪个是偏重异球;3)如果换球称第2次后天平平衡打破,并 且 c l 降低了,这说明异球肯定在换过来的a 5和 a 6两求中,并且异球偏重,否则天平要么平衡要么保持c l 上升。确定要找球是偏重之后,将 a 5 和 a 6放到两盘上称第3 次根据哪边高可以判定a 5 和 a 6哪个是重球;B:第 1 次称后c l 是下降的,此时可以将c l 看成c 2,其实以后的步骤都同A,所以就不必要再重复叙述了。至此,不管情况如何,用且只用三次就能称出1 2 个外观手感一模一样的小球中有质量不同于其他1 1 球的偏常的球。而且在称的过程中可以判定其是偏轻还是偏重。给一个奇数阶N幻方,填入数字1,2,3.N*N,使得横竖斜方向上的和都相同答案:#i n c l u d e#i n c l u d e#i n c l u d e u si n g n a m e sp a c e st d;i n t m a i n Oi n t n;c i n n;i n t i;i n t *M a t r=n e w i n t*n ;动态分配二维数组f o r (i=0;i n;+i)M a t r i =n e w i n t n ;/动态分配二维数组/j=n/2 代表首行中间数作为起点,即 1 所在位置i n t j=n/2,n u m=l ;初始值i=0;wh i l e(n u m!=n*n+l)(往右上角延升,若超出则用%转移到左下角M a t r (i%n+n)%n (j%n+n)%n =n u m;斜行的长度和n是相等的,超出则转至下一斜行i f(n u m%n=0)i+;e l se(i ;j+;)n u m+;)f o r(i=0;i n;i+)f o r(j=0;j n;+j)coutsetw(int)loglO(n*n)+4)M atr i j ;格式控制 coutendlendl;/格式控制for(i=0;in;+i)delete Matr i;return 1;腾讯的一道面试题:(与百度相似,可惜昨天百度死在这方面了)/在 一 个 文 件 中 有10G个整数,乱序排列,要求找出中位数。内 存 限 制 为2G。只写出思路即可。答案:1,把整数分成256M段,每段可以用64位整数保存该段数据个数,256M*8=2G内存,先 清02,读10G整数,把整数映射到256M段中,增加相应段的记数3,扫 描256M段的记数,找到中位数的段和中位数的段前面所有段的记数,可以把其他段的内存释放4,因中位数段的可能整数取值已经比较小(如 果 是32bit整数,当然如果是64bit整数的话,可以再次分段),对每个整数做一个记数,再 读 一 次10G整数,只读取中位数段对应的整数,并设置记数。5,对新的记数扫描一次,即可找到中位数。如 果 是32bit整数,读10G整 数2次,扫 描256M记数一次,后一次记数因数量很小,可以忽略不记(设 是32bit整数,按无符号整数处理整数分成256M段?整数范围是0-2.32-1 一 共 有4G种取值,4G/256M=1 6,每 16 个数算一段 0T5 是 1 段,16-31 是一段,.一整数映射到256M段中?如果整数是0 T 5,则增加第一段记数,如果整数是16-31,则增加第二段记数,.其实可以不用分256M段,可以分的段数少一写,这样在扫描记数段时会快一些,还能节省一些内存)腾讯题二:一个文件中有40亿个整数,每个整数为四个字节,内存为1GB,写出一个算法:求出这个文件里的整数里不包含的一个整数答:方法一:4个字节表示的整数,总共只有万32约等于4G个可能。为了简单起见,可以假设都是无符号整数。分配500MB内存,每一 b it代表一个整数,刚好可以表示完4个字节的整数,初始值为0 o基本思想每读入一个数,就把它对应的b it位置为1,处理完40G个数后,对500M的内存遍历,找出一个b it为0的位,输出对应的整数就是未出现的。算法流程:1 )分配5 0 0 M B内存b u f,初始化为02)unsigned int x=0 xl;for each int j in filebuf=buf|x j;end(3)for(unsigned int i=0;i=O xffffffff;i+)if(!(buf&x i)output(i);break;)以上只是针对无符号的,有符号的整数可以依此类推。方法二:文件可以分段读啊,这个是0(2 n)算法,应该是很快的了,而且空间也允许的。不过还可以构造更快的方法的,更快的方法主要是针对定位输出的整数优化算法。思路大概是这样的,把值空间等分成若干个值段,比如值为无符号数,则0 0 0 0 0 0 0 0 H-0 0 0 0 0 F F F 1 I0 0 0 0 1 0 0 0 H-0 0 0 0 1 F F F HO O O O F O O O H-O O O O F F F F HF F F F F O O O H-F F F F F F F F H这样可以订立个规则,在一个值段范围内的数第一次出现时,对应值段指示值X n=X n+l,如果该值段的所有整数都出现过,则 X n=1 0 0 0 H,这样后面输H l 定位时就可以直接跳过这个值段了,因为题目仅仅要求输出一个,这样可以大大减少后面对标志数值的遍历步骤。理论上值段的划分有一定的算法可以快速的实现,比如利用位运算直接定位值段对应值进行计算。腾讯面试题:有 1 到 1 0 w 这 1 0 w 个数,去除2个并打乱次序,如何找出那两个数。(不准用位图!)位图解决:位图的方法如下假设待处理数组为A 1 0 w-2 定义一个数组B 1 0 w ,这里假设B中每个元素占用1比特,并初始化为全0 f o r(i=0;i 1 0 w-2;i+)(B A i =1那 么 B中不为零的元素即为缺少的数据这种方法的效率非常高,是计算机中最常用的算法之一其它方法:求和以及平方和可以得到结果,不过可能求平方和运算量比较大(用 6 4位 i n t 不会溢出)腾讯面试题:腾讯服务器每秒有2 w 个 Q Q 号同时上线,找出5 m i n 内重新登入的qq号并打印出来。解答:第二题如果空间足够大,可以定义一个大的数组a qq号,初始为零,然后这个qq号登陆了就a qq号+最后统计大于等于2的 Q Q 号这个用空间来代替时间第二个题目,有不成熟的想法。2 w x 3 0 0 s所 以 用 6,0 0 0,0 0 0 个桶。删除超时的算法后面说,所以平均桶的大小是1。假 设 qq号码一 共 有 1 0 1 0 个,所以每个桶装的q 号码是 1 0 1 0 /(6 *1 0 6)个,这个是插入时候的最坏效率(插入同一个桶的时候是顺序查找插入位置的)。q q 的节点结构和上面大家讨论的基本一样,增加一个指针指向输出列表,后面说。s t ru c t Q Q s t ru c t n u m _ t y p e qqn u m;t i m e s t a m p l a s t _ l o g o n _ t i m e;Q Q s t ru c t *p re;Q Q s t ru c t *n e xt;O u t P u t L i s t *o u t;/用 于 f re e 节点的时候,顺便更新一下输出列表。另外增加两个指针列表。第.个大小3 0 0 的循环链表,自带一个指向Q Q S t ru c t 的域,循 环 存 3 0 0 秒内的qq指针。时间一过就 f re e 掉,所以保证所有桶占用的空间在2 w X 3 0 0 以内。第二个是输出列表,就是存放题目需要输出的节点。如果登陆的用户,5 分钟内完全没有重复的话,每 秒 f re e 掉 2w个节点。不过在f re e 的时候,要判断一下时间是不是真的超时,因为把节点入桶的时候,遇到重复的,会更新一下最后登陆的时间。当然啦,这个时候,要 把 这 个 q q 号码放到需要输出的列表里面1、局部变量能否和全局变量重名?答:能,局部会屏蔽全局。要用全局变量,需要使用:局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体内。2、如何引用一个经定义过的全局变量?答:e x t e r n可以用引用头文件的方式,也可以用e x t e r n 关键字,如果用引用头文件方式来引用某个在头文件中声明的全局变理,假定你将那个变写借了,那么在编译期间会报错,如果你用 e x t e m 方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错。3、全局变量可不可以定义在可被多个.C 文件包含的头文件中?为什么?答:可以,在不同的C文件中以s t at ic 形式来声明同名全局变量。可以在不同的C文件中声明同名的全局变量,前提是其中只能有一个C文件中对此变量赋初值,此时连接不会巾错4、语 句 fo r (;1 ;)有什么问题?它是什么意思?答:和 w hil e(l)相同。5、d o”,w hil e 和 w hil e,d o 有什么区别?答:前一个循环一遍再判断,后一个判断以后再循环6、请写出下列代码的输出内容#in c l u d e s t d io.hm ain ()in t a,b,c,d;a=1 0;b=a+;c=+a;d=1 0*a+;p r in t f(/zb,c,d:%d,%d,%dz,,b,c,d);r e t u r n 0;答:1 0,1 2,1 2 07、s t at ic 全局变量与普通的全局变量有什么区别?s t at ic 局部变量和普通局部变量有什么区别?s t at ic 函数与普通函数有什么区别?全局变量(外部变量)的说明之前再冠以s t at ic 就构成了静态的全局变量。全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。从以上分析可以看出,把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。s t at ic 函数与普通函数作用域不同。仅在本文件。只在当前源文件中使用的函数应该说明为内部函数(s t at ic),内部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件s t at ic 全局变量与普通的全局变量有什么区别:s t at ic 全局变量只初使化一-次,防止在其他文件单元中被引用;s t at ic 局部变量和普通局部变量有什么区别:s t at ic 局部变量只被初始化一次,下一-次依据上一次结果值;s t at ic 函数与普通函数有什么区别:s t at ic 函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝8、程序的局部变量存在于(栈)中,全局变量存在于(静态区)中,动态申请数据存在于(堆)中。9、设有以下说明和定义:t yp e d e f u n io n l o n g i;i n t k 5;c h a r c;D A TE;s t r u c t d a t a i n t c a t;D A TE c o w;d o u b l e d o g;t o o;D A TE m a x;则语句 p r i n t f (*%dz/,s i z e o f (s t r u c t d a t e)+s i z e o f (m a x);的执行结果是:_ _ _ 5 2答:D A TE 是 个 u n i o n,变量公用空间.里面最大的变量类型是i n t 5,占用20 个字节.所以它的大小是20d a t a 是一个s t r u c t,每个变量分开占用空间.依次为i n t 4 +D A TE 20 +d o u b l e 8 =32.所以结果是20 +32=5 2.当然.在某些16位编辑器下,i n t 可能是2 字节,那么结果是i n t 2+D A TE 10 +d o u b l e 8 =2010、队列和栈有什么区别?队列先进先出,栈后进先出11、写出下列代码的输出内容t t i n c l u d e i n t i n c(i n t a)r e t u r n(+a);i n t m u l t i(i n t*a,i n t*b,i n t*c)r e t u r n(*c=*a*b);t y p e d e f i n t(FUN C I)(i n t i n);t y p e d e f i n t(FUN C 2)(i n t*,i n t*,i n t*);v o i d s h o w(FUN C 2 f u n,i n t a r g l,i n t*a r g 2)I N C p=&i n c;i n t t e m p =p(a r g l);f u n(&t e m p,f t a r g l,a r g 2);p r i n t f (%d n,*a r g 2);m a i n()i n t a;s h o w (m u l t i,10,&a);r e t u r n 0;答:110 12、请找出下面代码中的所以错误 说明:以下代码是把一个字符串倒序,如“a b e d”倒序后变为d e b a 1 t t i n c l u d e s t r i n g.hz,2、m a i n()3、4、c h a r*s r c=h e l l o,w o r l d”;5、c h a r*d e s t=N UL L;6、i n t l e n=s t r l e n(s r c);7、d e s t=(c h a r*)m a l l o c(l e n);8、c h a r*d=d e s t;9、c h a r*s=s r c l e n;10 w h i l e(l e n-!=0)11 d+=s-;12、p r i n t f (s,d e s t);13、r e t u r n 0;14、答:方法 1:i n t m a i n()c h a r*s r e =h e l l o,w o r l d”;i n t l e n =s t r l e n(s r c);c h a r*d e s t =(c h a r*)m a l l o c (l e n+1);要为 0 分配一个空间 c h a r*d =d e s t;c h a r*s=&s r c l e n T;指向最后一个字符 w h i l e(l e n !=0 )*d+=*s ;*d =0;尾部要加 0 p r i n t f (%s n,d e s t);f r e e(d e s t);/使用完,应当释放空间,以免造成内存汇泄露r e t u r n 0;方 法2:i n c l u d e#i n c l u d e m a i n()c h a r s t r =/h e l l o,w o r l dz,;i n t l e n=s t r l e n(s t r);c h a r t;f o r(i n t i=0;i l e n/2;i+)(t=s t r i;s t r i=s t r l e n-i-l;s t r l e n-i-l=t;printfstr);r e t u r n 0;l .-l,2,7,28,126请问28 和 126中间那个数是什么?为什么?第一题的答案应该是4*3-1=63规律是7 3-1(当 n为偶数Q 2,4)r T3+l(当 n为奇数1,3,5)答 案:632.用两个栈实现一个队列的功能?要求给出算法和思路!设 2 个栈为A,B,一开始均为空.入队:将新元素p u s h 入栈A;出队:(1)判断栈B是否为空;(2)如果不为空,则将栈A中所有元素依次p o p 出并p u s h 到栈B;(3)将栈B的栈顶元素p o p 出;这样实现的队列入队和出队的平摊复杂度都还是0(1),比上面的几种方法要好。3.在 c语言库函数中将一个字符转换成整型的函数是a t o o l O 吗,这个函数的原型是什么?函数名:a t o l功 能:把字符串转换成长整型数用 法:l o n g a t o l(c o n s t c h a r *n p t r);程序例:#i n c l u d e#i n c l u d e i n t m a i n(v o i d)(l o n g 1;c h a r *s t r =9 8 7 65 4 32”;1=a t o l(I s t r);p r i n t f (s t r i n g =%s i n t e g e r =%l d n”,s t r,1);r e t u r n(0);)13.对于一个频繁使用的短小函数,在C语言中应用什么实现,在C+中应用什么实现?c用宏定义,C+用 i n l i n e1 7.软件测试都有那些种类?黑盒:针对系统功能的测试白合:测试函数功能,各函数接口1 8.确定模块的功能和模块的接口是在软件设计的那个队段完成的?概要设计阶段1 9.en um stri n g(xl,x2,x3=1 0,x4,x5,x;问 x=0 x8 0 1 0 0 5,0 x8 0 1 0 f 4 ;2 0.un si gn ed ch ar*p l;un si gn ed l o n g*p 2;p l=(un si gn ed ch ar*)0 x8 0 1 0 0 0;p 2=(un si gn ed l o n g*)0 x8 1 0 0 0 0;请问 p l+5 二;p 2+5=;2 5 .请问下面程序有什么错误?i n t a 6 0 2 5 0 1 0 0 0 ,i,j,k;f o r(k=0;k=1 0 0 0;k+)f o r(j=0;j 2 5 0;j+)f o r(i=0;i 6 0;i+)a i j k =0;把循环语句内外换一下2 6.#def i n e M ax CB 5 0 0vo i d Lm i QueryCSm d(Struct M SgCB*p m sg)(un si gn ed ch ar ucCm dNum;f o r(ucCm dNum=O;ucCm dNum M ax_ GT_ Len gth)return GT Len gth ERROR;C语言面试题大汇总之华为面试题Eddy整理1、局部变量能否和全局变量重名?答:能,局部会屏蔽全局。要用全局变量,需要使用:;局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义个同名的局部变量,而那个局部变量的作用域就在那个循环体内。2、如何引用一个已经定义过的全局变量?答:exte r n可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引用某个在头文件中声明的全局变理,假定你将那个编写错了,那么在编译期间会报错,如果你用extern方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错。3、全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么?答:可以,在不同的C文件中以stati c形式来声明同名全局变量。可以在不同的C文件中声明同名的全局变量,前提是其中只能有一个C文件中对此变量赋初值,此时连接不会出错.4、请写出下列