华为软件测试工程师面试题内容摘要:

) //结尾没有‘;’10。 嵌入式系统中经常要用到无限循环,你怎么用C编写死循环。 答案:while(1){}或者for(。 )11。 关键字static的作用是什么。 这个简单的问题很少有人能回答完全。 在C语言中,关键字static有三个明显的作用:1). 在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。 2). 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。 它是一个本地的全局变量。 3). 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。 那就是,这个函数被限制在声明它的模块的本地范围内使用。 大多数应试者能正确回答第一部分,一部分能正确回答第二部分,同是很少的人能懂得第三部分。 这是一个应试者的严重的缺点,因为他显然不懂得本地化数据和代码范围的好处和重要性。 12。 关键字const有什么含意。 我只要一听到被面试者说:“const意味着常数”,我就知道我正在和一个业余者打交道。 去年Dan Saks已经在他的文章里完全概括了const的所有用法,因此ESP(译者:Embedded Systems Programming),只要能说出const意味着“只读”就可以了。 尽管这个答案不是完全的答案,但我接受它作为一个正确的答案。 (如果你想知道更详细的答案,仔细读一下Saks的文章吧。 )如果应试者能正确回答这个问题,我将问他一个附加的问题:下面的声明都是什么意思。 const int a。 int const a。 const int *a。 int * const a。 int const * a const。 前两个的作用是一样,a是一个常整型数。 第三个意味着a是一个指向常整型数的指针(也就是,整型数是不可修改的,但指针可以)。 第四个意思a是一个指向整型数的常指针(也就是说,指针指向的整型数是可以修改的,但指针是不可修改的)。 最后一个意味着a是一个指向常整型数的常指针(也就是说,指针指向的整型数是不可修改的,同时指针也是不可修改的)。 如果应试者能正确回答这些问题,那么他就给我留下了一个好印象。 顺带提一句,也许你可能会问,即使不用关键字const,也还是能很容易写出功能正确的程序,那么我为什么还要如此看重关键字const呢。 我也如下的几下理由:1). 关键字const的作用是为给读你代码的人传达非常有用的信息,实际上,声明一个参数为常量是为了告诉了用户这个参数的应用目的。 如果你曾花很多时间清理其它人留下的垃圾,你就会很快学会感谢这点多余的信息。 (当然,懂得用const的程序员很少会留下的垃圾让别人来清理的。 )2). 通过给优化器一些附加的信息,使用关键字const也许能产生更紧凑的代码。 3). 合理地使用关键字const可以使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改。 简而言之,这样可以减少bug的出现。 13。 关键字volatile有什么含意。 并举出三个不同的例子。 答案:提示编译器对象的值可能在编译器未监测到的情况下改变。 一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。 精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。 1). 并行设备的硬件寄存器(如:状态寄存器)2). 一个中断服务子程序中会访问到的非自动变量(Nonautomatic variables)3). 多线程应用中被几个任务共享的变量回答不出这个问题的人是不会被雇佣的。 我认为这是区分C程序员和嵌入式系统程序员的最基本的问题。 嵌入式系统程序员经常同硬件、中断、RTOS等等打交道,所用这些都要求volatile变量。 不懂得volatile内容将会带来灾难。 假设被面试者正确地回答了这是问题(嗯,怀疑这否会是这样),我将稍微深究一下,看一下这家伙是不是直正懂得volatile完全的重要性。 1) . 一个参数既可以是const还可以是volatile吗。 解释为什么。 2) . 一个指针可以是volatile 吗。 解释为什么。 3) . 下面的函数有什么错误:int square(volatile int *ptr){return *ptr * *ptr。 }下面是答案:1) . 是的。 一个例子是只读的状态寄存器。 它是volatile因为它可能被意想不到地改变。 它是const因为程序不应该试图去修改它。 2). 是的。 尽管这并不很常见。 一个例子是当一个中服务子程序修该一个指向一个buffer的指针时。 3). 这段代码的有个恶作剧。 这段代码的目的是用来返指针*ptr指向值的平方,但是,由于*ptr指向一个volatile型参数,编译器将产生类似下面的代码:int square(volatile int *ptr){int a,b。 a = *ptr。 b = *ptr。 return a * b。 }由于*ptr的值可能被意想不到地该变,因此a和b可能是不同的。 结果,这段代码可能返不是你所期望的平方值。 正确的代码如下:long square(volatile int *ptr){int a。 a = *ptr。 return a * a。 }位操作(Bit manipulation)14。 int (*s[10])(int) 表示的是什么啊。 答案:int (*s[10])(int) 函数指针数组,每个指针指向一个int func(int param)的函数。 答案:共享存储系统;消息传递系统;管道:以文件系统为基础 答案:资源竞争及进程推进顺序非法 答案:互斥、请求保持、不可剥夺、环路 答案:鸵鸟策略、预防策略、避免策略、检测与解除死锁25. 操作系统中进程调度策略有哪几种。 答案:FCFS(先来先服务),优先级,时间片轮转,多级反馈。 答案:类的静态成员每个类只有一个,非静态成员每个对象一个27. 纯虚函数如何定义。 使用时应注意什么。 答:virtual void f()=0。 是接口,子类必须要实现28. 数组和链表的区别 答案:数组:数据顺序存储,固定大小; 连表:数据可以随机存储,大小可动态改变30:(void *)ptr 和 (*(void**))ptr的结果是否相同。 其中ptr为同一个指针答案:.(void *)ptr 和 (*(void**))ptr值是相同的31:问函数既然不会被其它函数调用,为什么要返回1。 答案:mian中,c标准认为0表示成功,非0表示错误。 具体的值是某中具体出错信息33,已知一个数组table,用一个宏定义,求出数据的元素个数答案:define NTBLdefine NTBL (sizeof(table)/sizeof(table[0]))34。 线程与进程的区别和联系? 线程是否具有相同的堆栈? dll是否有独立的堆栈?答案:进程是死的,只是一些资源的集合,真正的程序执行都是线程来完成的,程序启动的时候操作系统就帮你创建了一个主线程。 每个线程有自己的堆栈。 DLL中有没有独立的堆栈,这个问题不好回答,或者说这个问题本身是否有问题。 因为DLL中的代码是被某些线程所执行,只有线程拥有堆栈,如果DLL中的代码是EXE中的线程所调用,那么这个时候是不是说这个DLL没有自己独立的堆栈。 如果DLL中的代码是由DLL自己创建的线程所执行,那么是不是说DLL有独立的堆栈。 以上讲的是堆栈,如果对于堆来说,每个DLL有自己的堆,所以如果是从DLL中动态分配的内存,最好是从DLL中删除,如果你从DLL中分配内存,然后在EXE中,或者另外一个DLL中删除,很有可能导致程序崩溃。 要求给出算法和思路。 答案:设2个栈为A,B, 一开始均为空.入队:将新元素push入栈A。 出队:(1)判断栈B是否为空;(2)如果不为空,则将栈A中所有元素依次pop出并push到栈B;(3)将栈B的栈顶元素pop出;这样实现的队列入队和出队的平摊复杂度都还是O(1), 比上面的几种方法要好。 ()吗,这个函数的原型是什么。 答案:函数名: atol 功能: 把字符串转换成长整型数 用法: long atol(const char *nptr)。 4。 对于一个频繁使用的短小函数,在C语言中应用什么实现,在C++中应用什么实现?答案:c用宏定义,c++用inline5。 直接链接两个信令点的一组链路称作什么? 答案:PPP点到点连接7。 软件测试都有那些种类?答案:黑盒:针对系统功能的测试 白合:测试函数功能,各函数接口8。 确定模块的功能和模块的接口是在软件设计的那个队段完成的? 答案:概要设计阶段问答题: Phone的原理是什么?答案:IPV6,端口有什么作用。 答案:三次握手,确定是哪个应用程序使用该协议局部变量能否和全局变量重名。 答案:能,局部会屏蔽全局。 要用全局变量,需要使用::局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。