收藏 分享(赏)

2012最全的C和C++笔试面试题汇总.pdf

上传人:HR专家 文档编号:6228939 上传时间:2019-04-03 格式:PDF 页数:71 大小:755.04KB
下载 相关 举报
2012最全的C和C++笔试面试题汇总.pdf_第1页
第1页 / 共71页
2012最全的C和C++笔试面试题汇总.pdf_第2页
第2页 / 共71页
2012最全的C和C++笔试面试题汇总.pdf_第3页
第3页 / 共71页
2012最全的C和C++笔试面试题汇总.pdf_第4页
第4页 / 共71页
2012最全的C和C++笔试面试题汇总.pdf_第5页
第5页 / 共71页
点击查看更多>>
资源描述

1、最全的 C 语言试题总结 C 语言终极面试宝典 _C 语言面试必 C语言 第一部分:基本概念及其它问答题 1、关键字 static 的作用是什么? 这个简单的问题很少有人能回答完全。在 C 语言中,关键字 static 有三个明显的作用: 1). 在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。 2). 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。 3). 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。 大多数应试者能正确

2、回答第一部分,一部分能正确回答第二部分,同是很少的人能懂得第三部分。这是一个应试者的严重的缺点,因为他显然不懂得本地化数据和代码范围的好处和重要性。 2、 “引 用 ”与指针的区别是什么? 答 、 1) 引用必须被初始化,指针不必。 2) 引用初始化以后不能被改变,指针可以改变所指的对象。 3) 不存在指向空值的引用,但是存在指向空值的指针。 指针通过某个指针变量指向一个对象后,对它所指向的变量间接操作。程序中使用指针,程序的可读性差;而引用本身就是目标变量的别名,对引用的操作就是对目标变量的操作。 流操作符 、赋值操作符 =的返回值、拷贝构造函数的参数、赋值操作符 =的参数、其它情况都推荐使

3、用引用。 3、 .h 头文件中的 ifndef/define/endif 的作用 ? 答:防止该头文件被重复引用。 4、 #include 与 #include “file.h”的区别? 答:前者是从 Standard Library 的路径寻找和引用 file.h,而后者是从当前工作路径搜寻并引用 file.h。 5、描述实时系统的基本特性 答 :在特定时间内完成特定的任务,实时性与可靠性。 6、全局变量和局部变量在内存中是否有区别?如果有,是什么区别? 答 :全局变量储存在静态数据区,局部变量在堆栈中。 7、什么是平衡二叉树? 答 :左右子树都是平衡二叉树 且左右子树的深度差值的绝对值不大

4、于 1。 8、堆栈溢出一般是由什么原因导致的? 答 : 1.没有回收垃圾资源 2.层次太深的递归调用 9、冒泡排序算法的时间复杂度是什么? 答 : O(n2) 10、什么函数不能声明为虚函数? 答: constructor 11、队列和栈有什么区别? 答:队列先进先出,栈后进先出 12、不能做 switch()的参数类型 答 : switch 的参数不能为实型。 13、局部变量能否和全局变量重名? 答:能,局部会屏蔽全局。要用全局变量,需要使用 ”:” 局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变 量,而不会用到全局变量。对于有些编译器而言,在同一个函数内可以定义多个

5、同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体内 14、如何引用一个已经定义过的全局变量? 答 、可以用引用头文件的方式,也可以用 extern 关键字,如果用引用头文件方式来引用某个在头文件中声明的全局变量,假定你将那个变量写错了,那么在编译期间会报错,如果你用 extern 方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错。 15、全局变量可不可以定义在可被多个 .C 文 件包含的头文件中?为什么? 答 、可以,在不同的 C 文件中以 static 形式来声明同名全局变量。 可以在不同的 C 文件中声明同名的全局变

6、量,前提是其中只能有一个 C 文件中对此变量赋初值,此时连接不会出错。 16、语句 for( ; 1 ; )有什么问题?它是什么意思? 答 、和 while(1)相同,无限循环。 17、 dowhile 和 whiledo 有什么区别? 答 、前一个循环一遍再判断,后一个判断以后再循环。 18、 statac 全局变量、局部变量、函数与普通全局变量、局部变量、函数 static全局变量与普通 的全局变量有什么区别? static局部变量和普通局部变量有什么区别?static 函数与普通函数有什么区别? 答 、全局变量 (外部变量 )的说明之前再冠以 static 就构成了静态的全局变量。全局变

7、量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不 能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用, 因此可以避免在其它源文件中引起错误。 从以上分析可以看出, 把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域, 限制了它的使用范围。

8、static 函数与普通函数作用域不同。仅在本文件。只在当前源文件中使用的函数应该说明为内部函数 (static),内部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要 包含这个头文件 static 全局变量与普通的全局变量有什么区别: static 全局变量只初使化一次,防止在其他文件单元中被引用 ; static 局部变量和普通局部变量有什么区别: static 局部变量只被初始化一次,下一次依据上一次结果值; static 函数与普通函数有什么区别: static 函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝

9、 19、程序的内存分配 答:一个由 c/C+编译的程序占用的内存分为以下几个部分 1、栈区( stack) 由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方 式类似于数据结构中的栈。 2、堆区( heap) 一般由程序员分配释放,若程序员不释放,程序结束时可能由 OS 回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。 3、全局区(静态区)( static) 全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统释放。 4、文字常量区 常量字符串就是放在这里的。程序

10、结束后由系统释放。 5、程序代码区 存放函数体的二进制代码 例子程序 这是一个前辈写的,非常详 细 /main.cpp int a=0; /全局初始化区 char *p1; /全局未初始化区 main() intb;栈 char s=”abc”; /栈 char *p2; /栈 char *p3=”123456; /1234560在常量区, p3在栈上。 static int c=0; /全局(静态)初始化区 p1 = (char*)malloc(10); p2 = (char*)malloc(20); /分配得来得 10和 20字节的区域就在堆区。 strcpy(p1,”123456); /

11、1234560放在常量区,编译器可能会将它与 p3所向 ”123456优化成一个地方。 20、解释堆和栈的区别 答:堆( heap)和栈 (stack)的区别 ( 1)申请方式 stack:由系统自动分配。例如,声明在函数中一个局部变量 int b;系统自动在栈中为 b 开辟空间 heap:需要程序员自己申请,并指明大小,在 c 中 malloc 函数 如 p1=(char*)malloc(10); 在 C+中用 new 运算符 如 p2=(char*)malloc(10); 但是注意 p1、 p2本身是在栈中的。 ( 2)申请后系统的响应 栈:只要栈的剩余空间大于所申请空间,系统将为程序提供

12、内存,否则将报异常提示栈溢出。 堆:首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时, 会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序,另外,对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小,这样,代码中的 delete 语句才能正确的释放本内存空间。另外,由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动的将多余的那部分重新 放入空闲链表中。 ( 3)申请大小的限制 栈:在 Windows 下 ,栈是向低地址扩展的数据结构,是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大

13、容量是系统预先规定好的,在 WINDOWS 下,栈的大小是 2M(也有的说是 1M,总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示 overflow。因此,能从栈获得的空间较小。 堆:堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算 机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。 ( 4)申请效率的比较: 栈 :由系统自动分配,速度较快。但程序员是无法控制的。 堆 :是由 new 分配的内存,一般速度比较慢,而且容易产生内存碎片 ,不过

14、用起来最方便 . 另外,在 WINDOWS 下,最好的方式是用 Virtual Alloc 分配内存,他不是在堆,也不是在栈 ,而是直接在进程的地址空间中保留一块内存,虽然用起来最不方便。但是速度快,也最灵活。 ( 5)堆和栈中的存储内容 栈:在函数调用时,第一个进栈的是主函数中后的下一条指令(函数调用语句的下 一条可执行语句)的地址,然后是函数的各个参数,在大多数的 C 编译器中,参数是由右往左入栈的,然后是函数中的局部变量。注意静态变量是不入栈的。 当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地址,也就是主函数中的下一条指令,程序由该点继续运行。 堆:一般是

15、在堆的头部用一个字节存放堆的大小。堆中的具体内容由程序员安排。 ( 6)存取效率的比较 char s1=”aaaaaaaaaaaaaaa”; char *s2=”bbbbbbbbbbbbbbbbb”; aaaaaaaaaaa 是在 运行时刻赋值的; 而 bbbbbbbbbbb 是在编译时就确定的; 但是,在以后的存取中,在栈上的数组比指针所指向的字符串 (例如堆 )快。 比如: #include voidmain() char a=1; char c=”1234567890; char *p=”1234567890; a = c1; a = p1; return; 对应的汇编代码 10:a=c

16、1; 004010678A4DF1movcl,byteptrebp-0Fh 0040106A884DFCmovbyteptrebp-4,cl 11:a=p1; 0040106D8B55ECmovedx,dwordptrebp-14h 004010708A4201moval,byteptredx+1 004010738845FCmovbyteptrebp-4,al 第一种在读取时直接就把字符串中的元素读到寄存器 cl 中,而第二种则要先把指针值读到edx 中,在根据 edx 读取字符,显然慢了。 21、什么是预编译 ,何时需要预编译 ? 答:预编译又称为预处理 ,是做些代码文本的替换工作。处理

17、#开头的指令 ,比如拷贝 #include包含的文件代码, #define 宏定义的替换 ,条件编译等,就是为编译做的预备工作的阶段,主要处理 #开始的预编译指令,预编译指令指示了在程序正式编译前就由编译器进行的操作,可以放在程序中的任何位置。 c 编译系统在对程序进行通常的编译之前,先进行预处理。 c 提供的预处理功能主要有以下三种: 1)宏定义 2)文件包含 3)条件编译 1、 总是使用不经常改动的大型代码体。 、程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的编译选项。在这种情况下,可以将所有包含文件预编译为一个预编译头。 22、关键字 const 是什么含意? 答:我只要一

18、听到被面试者说: “const意味着常数 ”,我就知道我正在和一个业余者打交道。去年 Dan Saks 已经在他的文章里完全概括了 const 的所有用法,因此 ESP(译者: Embedded Systems Programming)的每一位读者应该非常熟悉 const 能做什么和不能做什么 .如果你从没有读到那篇文章,只要能说出 const 意味着 “只读 ”就可以了。尽管这个答案不是完全的答案,但我接受它作为一个正确的答案。(如果你想知道更详细的答案,仔细读一下 Saks 的文章吧。)如果应试者能正 确回答这个问题,我将问他一个附加的问题:下面的声明都是什么意思? const int a

19、; int const a; const int *a; int * const a; int const * a const; 前两个的作用是一样, a 是一个常整型数。第三个意味着 a 是一个指向常整型数的指针(也就是,整型数是不可修改的,但指针可以)。第四个意思 a 是一个指向整型数的常指针(也就是说,指针指向的整型数是可以修改的,但指针是不可修改的)。最后一个意味着 a 是一个指向常整型数的常指针(也就是说,指针指向的整型数是不 可修改的,同时指针也是不可修改的)。如果应试者能正确回答这些问题,那么他就给我留下了一个好印象。顺带提一句,也许你可能会问,即使不用关键字 const,也还是

20、能很容易写出功能正确的程序,那么我为什么还要如此看重关键字 const 呢?我也如下的几下理由: 1). 关键字 const 的作用是为给读你代码的人传达非常有用的信息,实际上,声明一个参数为常量是为了告诉了用户这个参数的应用目的。如果你曾花很多时间清理其它人留下的垃圾,你就会很快学会感谢这点多余的信息。(当然,懂得用 const 的程序员很少会留下的垃圾让别人来 清理的。) 2). 通过给优化器一些附加的信息,使用关键字 const 也许能产生更紧凑的代码。 3). 合理地使用关键字 const 可以使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改。简而言之,这样可以减少

21、bug 的出现 23、关键字 volatile 有什么含意 并给出三个不同的例子。 答:一个定义为 volatile 的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备 份。下面是 volatile 变量的几个例子: 1). 并行设备的硬件寄存器(如:状态寄存器) 2). 一个中断服务子程序中会访问到的非自动变量 (Non-automatic variables) 3). 多线程应用中被几个任务共享的变量 回答不出这个问题的人是不会被雇佣的。我认为这是区分 C 程

22、序员和嵌入式系统程序员的最基本的问题。嵌入式系统程序员经常同硬件、中断、 RTOS 等等打交道,所用这些都要求volatile 变量。不懂得 volatile 内容将会带来灾难。 假设被面试者正确地回答了这是问题(嗯,怀疑这否会是这样 ),我将稍微深究一下,看一下这家伙是不是直正懂得 volatile 完全的重要性。 1). 一个参数既可以是 const 还可以是 volatile 吗?解释为什么。 2). 一个指针可以是 volatile 吗?解释为什么。 3). 下面的函数有什么错误: int square(volatile int *ptr) return *ptr * *ptr; 下面

23、是答案: 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 的值可能被意

24、想不到地该变,因此 a 和 b 可能是不同的。结果,这段代码可能返不是你所期望的平方值!正确的 代码如下: long square(volatile int *ptr) int a; a = *ptr; return a * a; 24、三种基本的数据模型 答:按照数据结构类型的不同,将数据模型划分为层次模型、网状模型和关系模型。 25、结构与联合有和区别? 答: (1). 结构和联合都是由多个不同的数据类型成员组成 , 但在任何同一时刻 , 联合中只存放了一个被选中的成员(所有成员共用一块地址空间) , 而结构的所有成员都存在(不同成员的存放地址不同)。 (2). 对于联合的不同成员赋值 ,

25、 将会对其 它成员重写 , 原来成员的值就不存在了 , 而对于结构的不同成员赋值是互不影响的 26、描述内存分配方式以及它们的区别 ? 答: 1) 从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量, static 变量。 2) 在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集。 3) 从堆上分配,亦称动态内存分配。程序在运行的时候用 malloc 或 new 申请任意多少的内存,程序员自己 负责在何时用 free 或 delete 释放内存。动态内存

26、的生存期由程序员决定,使用非常灵活,但问题也最多 27、请说出 const 与 #define 相比,有何优点? 答: Const 作用:定义常量、修饰函数参数、修饰函数返回值三个作用。被 Const 修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。 1) const 常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误。 2) 有些集成化的调试工具 可以对 const 常量进行调试,但是不能对宏常量进行调试。 28、简述数组与指针的区别? 答:数组要么在静态存储区被创建(如全

27、局数组),要么在栈上被创建。指针可以随时指向任意类型的内存块。 (1)修改内容上的差别 char a = “hello”; a0 = X; char *p = “world”; / 注意 p 指向常量字符串 p0 = X; / 编译器不能发现该错误,运行时错误 (2) 用运算符 sizeof 可以计算出数组的容量(字节数)。 sizeof(p),p 为指针得到的是一 个 指针变量的字节数,而不是 p 所指的内存容量。 C+/C 语言没有办法知道指针所指的内存容量,除非在申请内存时记住它。 注意当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针。 char a = “hello wor

28、ld”; char *p = a; cout-EXP) pointer : if ( a != NULL) or if(a = NULL) 30、如何判断一段程序是由 C 编译程序还是由 C+编译程序编 译的? 答: #ifdef _cplusplus coutnext,并随后删除原 next指向的节点。 第二部分:程序代码评价或者找错 1、下面的代码输出是什么,为什么? void foo(void) unsigned int a = 6; int b = -20; (a+b 6) ? puts(“ 6) : puts(“6。原因是当表达式中存在有符号类型和无符号类型时所有的操作数都自动转换为

29、无符号类型。因此 -20变成了一个非常大的正整数,所以该表达式计算出的结果大于 6。这一点 对于应当频繁用到无符号数据类型的嵌入式系统来说是丰常重要的。如果你答错了这个问题,你也就到了得不到这份工作的边缘。 2、评价下面的代码片断: unsigned int zero = 0; unsigned int compzero = 0xFFFF; /*1s complement of zero */ 对于一个 int 型不是 16位的处理器为说,上面的代码是不正确的。应编写如下: unsigned int compzero = 0; 这一问题真正能揭露出应试者是否懂得处理器字长的重要性。在我的经验里

30、,好的 嵌入式程序员非常准确地明白硬件的细节和它的局限,然而 PC 机程序往往把硬件作为一个无法避免的烦恼。 3、 C 语言同意一些令人震惊的结构 ,下面的结构是合法的吗,如果是它做些什么? int a = 5, b = 7, c; c = a+b; 这个问题将做为这个测验的一个愉快的结尾。不管你相不相信,上面的例子是完全合乎语法的。问题是编译器如何处理它?水平不高的编译作者实际上会争论这个问题,根据最处理原则,编译器应当能处理尽可能所有合法的用法。因此,上面的代码被处理成: c = a+ + b; 因此 , 这段代码 持行后 a = 6, b = 7, c = 12。 如果你知道答案,或猜出

31、正确答案,做得好。如果你不知道答案,我也不把这个当作问题。我发现这个问题的最大好处是这是一个关于代码编写风格,代码的可读性,代码的可修改性的好的话题。 4、设有以下说明和定义: typedef union long i; int k5; char c; DATE; struct data int cat; DATE cow; double dog; too; DATE max; 则语句 printf(“%d”,sizeof(struct date)+sizeof(max);的执行结果是? 答 、结果是: 52。 DATE 是一个 union, 变量公用空间 . 里面最大的变量类型是 int5,

32、 占用20个字节 . 所以它的大小是 20 data 是一个 struct, 每个变量分开占用空间 . 依次为 int4 + DATE20 + double8 = 32. 所以结果是 20 + 32 = 52. 当然 在某些 16位编辑器下 , int 可能是 2字节 ,那么结果是 int2 + DATE10 + double8 = 20 5、请写出下列代码的输出 内容 #include main() int a,b,c,d; a=10; b=a+; c=+a; d=10*a+; printf(“b, c, d: %d, %d, %d”, b, c, d) ; return 0; 答: 10,

33、 12, 120 6、写出下列代码的输出内容 #include int inc(int a) return(+a); int multi(int*a,int*b,int*c) return(*c=*a*b); typedef int(FUNC1)(int in); typedef int(FUNC2) (int*,int*,int*); void show(FUNC2 fun,int arg1, int*arg2) INCp= int temp =p(arg1); fun( printf(“%dn”,*arg2); main() int a; show(multi,10, return 0;

34、答: 110 7、请找出下面代码中的所以错误 说明:以下代码是把一个字符串倒序,如 “abcd”倒序后变为 “dcba” 1、 #include”string.h” 2、 main() 3、 4、 char*src=”hello,world”; 5、 char* dest=NULL; 6、 int len=strlen(src); 7、 dest=(char*)malloc(len); 8、 char* d=dest; 9、 char* s=srclen; 10、 while(len!=0) 11、 d+=s; 12、 printf(“%s”,dest); 13、 return 0; 14、

35、答: 方法 1: int main() char* src = “hello,world”; int len = strlen(src); char* dest = (char*)malloc(len+1);/要为 0分配一个空间 char* d = dest; char* s = /指向最后一个字符 while( len != 0 ) *d+=*s; *d = 0;/尾部要加 0 printf(“%sn”,dest); free(dest);/ 使用完,应当释放空间,以免造成内存汇 泄露 return 0; 方法 2: #include #include main() char str=”h

36、ello,world”; int len=strlen(str); char t; for(int i=0; i t=stri; stri=strlen-i-1; strlen-i-1=t; printf(“%s“,str); return 0; 8、请问下面程序有什么错误 ? int a602501000,i,j,k; for(k=0;k=1000;k+) for(j=0;j250;j+) for(i=0;i60;i+) aijk=0; 答案:把循环语句内外换一下 9、请问下面程序会出现什么情况 ? . #define Max_CB 500 void LmiQueryCSmd(Struct

37、MSgCB * pmsg) unsigned char ucCmdNum; for(ucCmdNum=0;ucCmdNum ; 答案:死循环 10、以下 3个有什么区别 char * const p; /常量指针, p 的值不可以修改 char const * p; /指向常量的指针,指向的常量值不可以改 const char *p; /和 char const *p 11、写出下面的结果 char str1 = “abc“; char str2 = “abc“; const char str3 = “abc“; const char str4 = “abc“; const char *str

38、5 = “abc“; const char *str6 = “abc“; char *str7 = “abc“; char *str8 = “abc“; cout ( str1 = str2 ) endl; cout ( str3 = str4 ) endl; cout ( str5 = str6 ) endl; cout ( str7 = str8 ) endl; 结果是: 0 0 1 1 解答: str1,str2,str3,str4是数组变量,它们有各自的内存空间; 而 str5,str6,str7,str8是指针,它们指向相同的常量区域。 12、 以下代码中的两个 sizeof 用法有

39、问题吗? void UpperCase( char str ) / 将 str 中的小写字母转换成大写字母 for( size_t i=0; i if( a=stri char str = “aBcDe“; cout “str 字符长度为 : “ sizeof(str)/sizeof(str0) endl; UpperCase( str ); cout str endl; 答:函数内的 sizeof 有问题。根据语法, sizeof 如用于数组,只能测出静态数组的大小,无法检测动态分配的或外部数组大小。函数外的 str 是一个静态定义的数组,因此其大小为 6,函数内的 str 实际只是一个指向

40、字符串的指针,没有任何额外的与数组相关的信息,因此sizeof 作用于上只将其当指针看,一个指针为 4个字节,因此返回 4。 13、写出输出结果 main() int a5=1,2,3,4,5; int *ptr=(int *)( printf(“%d,%d“,*(a+1),*(ptr-1); 输出: 2,5 *(a+1)就是 a1, *(ptr-1)就是 a4,执行结果是 2, 5 则 ptr 实际是 而指针加 1要根据指针类型加上一定的值, 不同类型的指针 +1之后增加的大小不同 a 是长度为 5的 int 数组指针,所以要加 5*sizeof(int) 所以 ptr 实际是 a5 但是

41、prt 与 ( char *str= strcpy(str,“hello“); printf(str); return 0; 没有为 str 分配内存空间,将会发生异常 问题出在将一个字符串复制进一个字符变量指针所指地址。虽然可以正确输出结果,但因为越界进行内在读写而导致程序崩溃。 char* s=“AAA“; printf(“%s“,s); s0=B; printf(“%s“,s); 有什么错? “AAA“是字符串常量。 s 是指针,指向这个字符串常量,所以声明 s 的时候就有问题。 cosnt char* s=“AAA“; 然后又因为是常量,所以对是 s0的赋值操作是不合法的。 15、有以

42、下表达式: int a=248; b=4;int const c=21;const int *d= int *const e=int const *f const = 请问下列表达式哪些会被编译器禁止?为什么? *c=32;d=*d=43;e=34;e=f=0x321f; *c 这是个什么东东,禁止 *d 说了是 const, 禁止 e = 禁止 16、交换两个变量的值,不使用第三个变量。 即 a=3,b=5,交换之后 a=5,b=3; 有两种解法 , 一种用算术算法 , 一种用 (异或 ) a = a + b; b = a - b; a = a - b; or a = ab;/ 只能对 in

43、t,char b = ab; a = ab; or a = b = a; 17、下面的程序会出现什么结果 .#include #include void getmemory(char *p) p=(char *) malloc(100); strcpy(p,”hello world”); int main( ) char *str=NULL; getmemory(str); printf(“%s/n”,str); free(str); return 0; 程序崩溃, getmemory 中的 malloc 不能返回动态内存, free()对 str 操作很危险 18、下面的语句会出现什么结果?

44、 char szstr10; strcpy(szstr,”0123456789); 答案:长度不一样,会造成非法的 OS,应该改为 char szstr11; 19、 (void *)ptr 和 (*(void*)ptr 的结果是否相同? 答:其中 ptr 为同一个指针 .(void *)ptr 和 (*(void*)ptr 值是相同的 20、问函数既然不会被其它函数调用,为什么要返回 1? int main() int x=3; printf(“%d”,x); return 1; 答: mian 中, c 标准认为 0表示成功,非 0表示错误。具体的值是某中具体出错信息 21、对绝对地址 0

45、100000赋值且想让程序跳转到绝对地址是 0100000去执行 (unsigned int*)0100000 = 1234; 首先要将 0100000强制转 换成函数指针 ,即 : (void (*)()0100000 然后再调用它 : *(void (*)()0100000)(); 用 typedef 可以看得更直观些 : typedef void(*)() voidFuncPtr; *(voidFuncPtr)0100000)(); 22、输出多少?并分析过程 unsigned short A = 10; printf(“A = %un”, A); char c=128; printf(

46、“c=%dn”,c); 第一题, A 0xfffffff5,int 值 为 11,但输出的是 uint。所以输出 4294967285 第二题, c 010,输出的是 int,最高位为 1,是负数,所以它的值就是 000的补码就是 128,所以输出 128。 这两道题都是在考察二进制向 int 或 uint 转换时的最高位处理。 23、分析下面的程序: void GetMemory(char *p,int num) *p=(char *)malloc(num); int main() char *str=NULL; GetMemory( strcpy(str,”hello”); free(st

47、r); if(str!=NULL) strcpy(str,”world”); printf(“n str is %s”,str); getchar(); 问输出结果是什么?希望大家能说说原因,先谢谢了 输出 str is world。 free 只是释放的 str 指向的内存空间 ,它本身的值还是存在的 . 所以 free 之后,有一个好的习惯就是将 str=NULL. 此时 str 指向空间的内存已被回收 ,如果输出语句之前还存在分配空间的操作的话 ,这段存储空间是可能被重 新分配给其他变量的 , 尽管这段程序确实是存在大大的问题(上面各位已经说得很清楚了),但是通常会打印出world 来。

48、 这是因为,进程中的内存管理一般不是由操作系统完成的,而是由库函数自己完成的。 当你 malloc 一块内存的时候,管理库向操作系统申请一块空间(可能会比你申请的大一些),然后在这块空间中记录一些管理信息(一般是在你申请的内存前面一点),并将可用内存的地址返回。但是释放内存的时候,管理库通常都不会将内存还给操作系统,因此你是可以继续访问这块地址的,只不过。楼上都说过了,最好别这么干。 24、 char a10,strlen(a)为什么等于 15?运行的结果 #include “stdio.h” #include “string.h” void main() char aa10; printf(“%d”,strlen(aa); sizeof()和初不初始化,没有关系; strlen()和初始化有关。 char (*str)20;/*str 是一个数组指针,即指向数组的指针 */ char *str20;/*str 是一个指针数组,其元素为指针型数据 */ 25、 long a=0801010;a+5=? 答: 0801010用二进制表示为: “1000 0000 0001 0000 0001 0000”,十进制的值为 8392720,再加上 5就是 8392725 26、给定结构 struct A

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报