深信服(已挂)C/C++
9月24日 14:00
一面凉经(50min):
1、自我介绍,明确要求介绍项目,于是临时发挥了一下。2、C语言的IO有了解吗?我回答了像 鼠标键盘之类的IO,套接字、打开文件等IO。面试官说他指的就是打开文件,问我了解有哪些打开文件的函数,我只知道一个open
问我open的传入参数有哪些?我说了文件名、长度(瞎猜的)
要求我写一个函数,打开一个文件,写入hello,然后在寻找到o的位置,再关闭。(不会~)
3、内存结构?(堆、栈、数据区、程序区。)
问栈里主要的存放数据是什么?我回答比如主函数中的int类型、char类型数据,这类普通变量,或者遇到子函数,创建新的栈帧,压栈之类的。问内存的分配主要有什么函数,我说malloc分配,分配在堆中,通常搭配free;还有alloc分配,分配在栈中。
那请问关键字new 和malloc的区别,一个关键字,一个函数,并且函数需要指定大小;此外new分配的内存是可以在静态存储区,malloc只能在堆中。
那请问new出来的对象可以怎么样清除呢?我说如果知道指针位置,可以直接将该位置的数据清除(瞎说的),后面还补一句,我用JAVA比较多,堆中的对象清除一般就是垃圾回收吧。(哈哈哈)
4、创建进程需要分配的资源(PCB块、内存等)
怎么在linux中创建进程,我表示fork、还有后台运行nohup ………………&之类的。
linux中怎么查看进程的系统调用?我以为是说如何查看进程,我表示用ps或者top看,面试官就无奈说了一句查看进程的“系统调用”,我表示不知道。5、问我哈希表的原理,讲了查看的时间复杂度是O(1),Key的计算公式,高16位与低16位,再与上桶长度-1,想唬一下他。(哈哈哈)
这时,他说C++中还有啥常用数据结构,我直接说数组、链表、树、红黑树、B+树(哈哈哈哈,后面补了一句,常用的就是数组、链表、树之类的)。
面试官挑了一个树问我,问题没听清,我就解释树的结构,以二叉树为例,每个节点最多只有两个子节点,通常一个节点里包含本节点数据、左节点指针、右节点指针。
这时候突然问,C++中存汉字能够用什么数据结构?我确实不太会,就说数组、链表。
6、C++的虚函数的多态,(和JAVA多态差不多,即使没用过C++我也能说个大概唬一下哈哈哈哈)。
7、套接字通信相关,问我unix的socket和linux的socket的区别,我一开始听成了udp的socket和tcp的socket区别……
蒙了,没学过unix和linux的区别,但还是需要讲自己会的。
于是我逮着linux的socket讲,讲了创建socket创建、bind、listen、accept、recv、sent等。最后补上一句,两者区别我不太了解。也算正面回应他的问题(哈哈哈哈哈)
8、这时候问我具体实习项目,实习中遇到的困难了,我就讲了一下网关的这个项目。
根据我的实习内容问我:
网关的寻址,我说了一个默认网关IP,他提示说路由表,我就讲了路由表的作用、IP寻址流程、以及arp协议。
然后问我策略路由(听说过,但不清楚概念,直接表示不会)
9、问了一个C语言的概念,位域,我忘记是啥了,直接表示不记得。后面百度了一下,就是节约空间的一种做法,用冒号搞定。
10、做题,给个字符串IP,判断是否合法。
我说可以用JAVA吗,他说只能C和C++,好吧,我投降,用C写。
过程中还说,本来不可以给你看具体条件要求,我现在复制过来给你看看。(什么条件要求呢?就是1、首位不能为0,;2、每段IP不能超过255……)
我心里在想,这玩意你就算不给我也知道吧……。
题目不出所料没做出来,C语言太不熟练了。
讲了一下思路,一个left一个right指针,找到“.”号的时候,就算left和right之间的值,然而我不知道C语言中有什么函数可以转化string和int。
于是手写一下,循环取出当前char,减去48得到int类型,通过right-left知道具***数,比如百位、十位等,然后循环相加就可以了得到具体值。
最后我傲娇地表示,要是这道题给我用JAVA,直接一个split,然后判断charAt(0)是否为0,接着判断长度是否大于3,最后转化为int判断。
反问:
我没啥问题,就直接说,部门里还是用C和C++多,我可能还是需要增加我的知识储备。面试官说部门不用JAVA,说这是一个双向选择的过程。(哈哈哈,基本上没了)
总结:面试在14:00,我刚从迈瑞线下面试回来,坐车坐得身心俱疲,本来就是随意广投的深信服,面试的时候变得一身轻松,因为知道自己大概率挂,反而面得出奇平静。
这就是心理作用吧,越紧张反而越容易出错,淡定地面对反而让我发现自己某些概念的不熟悉,也算增加了我的知识面,原本以为20-30分钟我就顶不住了,结果面了50min。
9.30 感谢信。 #深信服##C/C++##面经#