C语言6个有趣的面试题
C语言6个有趣的面试题1、gets()函数问: 请找出下面代码里的问题。答:上面代码里的问题在于函数gets()的使用,这个函数从stdin接收一个字符串而不检查它所复制的缓存的容积,这可能会导致缓存溢出。这里推荐使用标准函数fgets()代替。2、main()的返回类型问:下面的代码能编译通过吗? 如果能,它有什么潜在的问题吗?答:因为main()方法的返回类型,这段代码的错误在大多数编译器里会被当作警告。main()的返回类型应该是“int”而不是“void”。因为“int”返回类型会让程序返回状态值。这点非常重要,特别当程序是作为依赖于程序成功运行的脚本的一部分运行时。3、内存泄露问:下面的代码会导致内存泄漏吗?答:尽管上面的代码并没有释放分配给“ptr”的内存,但并不会在程序退出后导致内存泄漏。在程序结束后,所有这个程序分配的内存都会自动被处理掉。但如果上面的代码处于一个“while循环”中,那将会导致严重的内存泄漏问题!4、使用_exit退出问: 在下面的代码中,atexit()并没有被调用,为什么?答:这是因为_exit()函数的使用,该函数并没有调用atexit()等函数清理。如果使用atexit()就应当使用exit()或者“return”与之相配合。5、*和++操作问:下面的操作会输出什么? 为什么?答:输出结果应该是这样:[L] [i]。因为“++”和“”的优先权一样,所以“ptr++”相当于“(ptr++)”。即应该先执行ptr++,然后才是ptr,所以操作结果是“L”。第二个结果是“i”。6、问: 修改代码片段(或者只读代码) 问:下面的代码段有错,你能指出来吗?答:这是因为,通过*ptr =“T’,会改变内存中代码段(只读代码)“Linux”的第一个字母。这个操作是无效的,因此会造成seg-fault或者崩溃。
C/C++经典面试题
C/C++经典面试题 面试题 1:变量的声明和定义有什么区别 为变量分配地址和存储空间的称为定义,不分配地址的称为声明。一个变量可以在多个地方声明, 但是只在一个地方定义。加入 extern修饰的是变量的声明,说明此变量将在文件以外或在文件后面部分 定义。 说明:很多时候一个变量,只是声明不分配内存空间,直到具体使用时才初始化,分配内存空间, 如外部变量。 面试题 2:写出 bool 、int、 float、指针变量与“零值”比较的 if 语句 bool型数据: if( flag ) { A; } else { B; } int型数据: if( 0 != flag ) { A; } else { B; } 指针型数: if( NULL == flag ) { A; } else { B; } float型数据: if ( ( flag >= NORM ) && ( flag <= NORM ) ) { A; 2 } 注意:应特别注意在 int、指针型变量和“零值”比较的时候,把“零值”放在左边,这样当把“==” 误写成“=”时,编译器可以报错,否则这种逻辑错误不容易发现,并且可能导致很严重的后果。 面试题 3:sizeof 和strlen的区别 sizeof和 strlen 有以下区别: sizeof是一个操作符,strlen是库函数。 sizeof的参数可以是数据的类型,也可以是变量,而 strlen只能以结尾为‘\0‘的字符串作参数。 编译器在编译时就计算出了 sizeof 的结果。而 strlen 函数必须在运行时才能计算出来。并且 sizeof 计算的是数据类型占内存的大小,而 strlen计算的是字符串实际的长度。 数组做sizeof的参数不退化,传递给strlen就退化为指针了。 注意:有些是操作符看起来像是函数,而有些函数名看起来又像操作符,这类容易混淆的名称一定 要加以区分,否则遇到数组名这类特殊数据类型作参数时就很容易出错。最容易混淆为函数的操作符就 是 sizeof。 面试题 4:C 语言的关键字 static 和 C++ 的关键字 static 有什么区别 在C 中static 用来修饰局部静态变量和外部静态变量、函数。而 C++中除了上述功能外,还用来定 义类的成员变量和函数。即静态成员和静态成员函数。 注意:编程时 static的记忆性,和全局性的特点可以让在不同时期调用的函数进行通信,传递信息, 而 C++的静态成员则可以在多个对象实例间进行通信,传递信息。 面试题 5:C中的 malloc 和C++中的 new有什么区别 malloc和 new有以下不同: (1)new、 是操作符,可以重载,只能在 C++中使用。 (2)malloc、free是函数,可以覆盖,C、C++中都可以使用。 (3)new 可以调用对象的构造函数,对应的 调用相应的析构函数。 (4)malloc仅仅分配内存,free 仅仅回收内存,并不执行构造和析构函数 (5)new、 返回的是某种数据类型指针,malloc、free 返回的是void指针。 注意:malloc申请的内存空间要用 free释放,而 new申请的内存空间要用 释放,不要混用。 因为两者实现的机理不同。 面试题 6:写一个“标准”宏 MIN #define min(a,b)((a)<=(b)?(a):(b)) 注意:在调用时一定要注意这个宏定义的副作用,如下调用: ((++*p)<=(x)?(++*p):(x)。 p指针就自加了两次,违背了 MIN的本意。 面试题 7:一个指针可以是 volatile 吗 可以,因为指针和普通变量一样,有时也有变化程序的不可控性。常见例:子中断服务子程序修改 一个指向一个 buffer的指针时,必须用 volatile来修饰这个指针。 说明:指针是一种普通的变量,从访问上没有什么不同于其他变量的特性。其保存的数值是个整型 数据,和整型变量不同的是,这个整型数据指向的是一段内存地址。 面试题 8:a 和&a 有什么区别 请写出以下代码的打印结果,主要目的是考察 a和&a的区别。 #include void main( void ) { int a[5]={1,2,3,4,5}; int *ptr=(int *)(&a+1); printf(“%d,%d”,*(a+1),*(ptr-1)); return; } 输出结果:2,5。 注意:数组名 a可以作数组的首地址,而&a是数组的指针。思考,将原式的 int *ptr=(int *)(&a+1); 改为 int *ptr=(int *)(a+1);时输出结果将是什么呢? 面试题 9:简述 C、C++程序编译的.内存分配情况 C、C++中内存分配方式可以分为三种: (1)从静态存储区域分配: 内存在程序编译时就已经分配好,这块内存在程序的整个运行期间都存在。速度快、不容易出错, 因为有系统会善后。例如全局变量,static变量等。 (2)在栈上分配: 在执行函数时,函数内局部变量的存储单元都在栈上创建,函数执行结束时这些存储单元自动被释 放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。 (3)从堆上分配: 即动态内存分配。程序在运行的时候用 malloc 或 new 申请任意大小的内存,程序员自己负责在何 时用free 或 释放内存。动态内存的生存期由程序员决定,使用非常灵活。如果在堆上分配了空间, 就有责任回收它,否则运行的程序会出现内存泄漏,另外频繁地分配和释放不同大小的堆空间将会产生 堆内碎块。 一个C、C++程序编译时内存分为 5大存储区:堆区、栈区、全局区、文字常量区、程序代码区。 4 面试题 10:简述 strcpy、sprintf 与 memcpy的区别 三者主要有以下不同之处: (1)操作对象不同,strcpy的两个操作对象均为字符串,sprintf的操作源对象可以是多种数据类型, 目的操作对象是字符串, memcpy 的两个对象就是两个任意可操作的内存地址,并不限于何种数据类型。 (2)执行效率不同,memcpy最高,strcpy次之,sprintf的效率最低。 (3)实现功能不同,strcpy主要实现字符串变量间的拷贝,sprintf 主要实现其他数据类型格式到字 符串的转化,memcpy主要是内存块间的拷贝。 说明:strcpy、sprintf 与memcpy都可以实现拷贝的功能,但是针对的对象不同,根据实际需求,来 选择合适的函数实现拷贝功能。 ;
C语言编程“Hello,world”应该怎们弄
步骤如下:1、打开我们的Visual C++ 6.0软件,我使用的为中文版,软件主界面如下图所示:2、然后点击上图工具栏中的文件,里面有个新建菜单,然后我们可以设置一下我们的工作空间,如下图所示:3、接下来,再点击工具栏下的文件,里面有个新建菜单,点击它,出现下图的对话框:4、点击确定即可,创建出一个helloworld.c的小程序,然后我们就可以编写我们的Hello World小程序了。此时就需要我们的VC++ 6.0来编译此程序,编译无错误才运行此程序,编译按钮和运行按钮如下图的红色箭头处:5、可以点击组建工具栏下的编译菜单项,然后再点击执行菜单项,也有快捷键,按Ctrl+F7编译此程序,按Ctrl+F5运行此程序。编译无错误的话,点击运行按钮后如下图所示:扩展资料:C语言特点:1、C语言是一个有结构化程序设计、具有变量作用域(variable scope)以及递归功能的过程式语言。2、C语言传递参数均是以值传递(pass by value),另外也可以传递指针(a pointer passed by value)。3、不同的变量类型可以用结构体(struct)组合在一起。4、只有32个保留字(reserved keywords),使变量、函数命名有更多弹性。5、部份的变量类型可以转换,例如整型和字符型变量。6、通过指针(pointer),C语言可以容易的对存储器进行低级控制。7、预编译处理(preprocessor)让C语言的编译更具有弹性。
hello world 用C语言怎么编写
代码如下:#include int main(void){printf("Hello, world!");return 0;}一、首先,打开我们的Visual C++ 6.0软件,我使用的为中文版,软件主界面如下图所示:1、然后点击上图工具栏中的文件,里面有个新建菜单,然后我们可以设置一下我们的工作空间,如下图所示:2、然后在一步步默认点击确定,完成即可,此时工作空间就建立起来了。二、接下来,再点击工具栏下的文件,里面有个新建菜单,点击它,出现下图的对话框:1、点击确定即可,创建出一个helloworld.c的小程序,然后我们就可以编写我们的Hello World小程序了。此时就需要我们的VC++ 6.0来编译此程序,编译无错误才运行此程序,编译按钮和运行按钮如下图的红色箭头处:2、或者可以点击组建工具栏下的编译菜单项,然后再点击执行菜单项,也有快捷键,按Ctrl+F7编译此程序,按Ctrl+F5运行此程序。编译无错误的话,点击运行按钮后如下图所示: 扩展资料:C语言的基本构成:1、数据类型。C的数据类型包括:整型、字符型、实型或浮点型(单精度和双精度)、枚举类型、数组类型、结构体类型、共用体类型、指针类型和空类型。2、常量与变量。常量其值不可改变,符号常量名通常用大写。变量是以某标识符为名字,其值可以改变的量。标识符是以字母或下划线开头的一串由字母、数字或下划线构成的序列,请注意第一个字符必须为字母或下划线,否则为不合法的变量名。变量在编译时为其分配相应存储单元。3、数组。如果一个变量名后面跟着一个有数字的中括号,这个声明就是数组声明。字符串也是一种数组。它们以ASCII的NULL作为数组的结束。要特别注意的是,方括内的索引值是从0算起的。4、指针。(1)、如果一个变量声明时在前面使用 * 号,表明这是个指针型变量。换句话说,该变量存储一个地址,而 *(此处特指单目运算符 * ,下同。C语言中另有 双目运算符 *) 则是取内容操作符,意思是取这个内存地址里存储的内容。指针是 C 语言区别于其他同时代高级语言的主要特征之一(2)、指针不仅可以是变量的地址,还可以是数组、数组元素、函数的地址。通过指针作为形式参数可以在函数的调用过程得到一个以上的返回值,不同于return(z)这样的仅能得到一个返回值。(3)指针是一把双刃剑,许多操作可以通过指针自然的表达,但是不正确的或者过分的使用指针又会给程序带来大量潜在的错误。 5、字符串。C语言的字符串其实就是以'\0'字符结尾的char型数组,使用字符型并不需要引用库,但是使用字符串就需要C标准库里面的一些用于对字符串进行操作的函数。它们不同于字符数组。使用这些函数需要引用头文件。6、文件输入/输出在C语言中,输入和输出是经由标准库中的一组函数来实现的。在ANSI C中,这些函数被定义在头文件;中。参考资料:百度百科:C语言