志在指尖
用双手敲打未来

c语言面试题(题目100及最佳答案)

c语言面试题

指针的运用,一直是c语言面试题中必考的部分,因为指针自身运用的复杂性与普适性,所以考点非常多,并且也能够与其他知识彼此结合,因而咱们将会运用五篇专题的篇幅来介绍指针。分析下面的程序,指出程序中的错误:#includeintmain(void){chara;char*str=&a;strcpy(str,”hello”);printf(“%s\n”,str);return0;}
本题解析没有正确为str分配内存空间,将会发生反常。问题出在将一个字符串仿制进一个字符变量指针所指地址。虽然编译的时候没有报错,但是在运行过程中,因为越界拜访了未被分配的内存,而导致段错误。相关知识点在处理与指针相关的问题时,首要需要搞理解的便是内存,因为指针操作的便是内存。
第一个,便是内存的分区。这也是常常会被调查的一个考点。
写出内存分为几大区域关于这个问题,有几种不不同的说法。有的说内存分为五大分区,有的说分为四大分区,咱们先来先看五个分区的说法:以为内存分为五大分区的人,通常会这样差异:1、BSS段(bsssegment)通常是指用来寄存程序中未初始化的大局变量和静态变量(这里留意一个问题:一般的书上都会说大局变量和静态变量是会主动初始化的,那么哪来的未初始化的变量呢?变量的初始化能够分为显现初始化和隐式初始化,大局变量和静态变量假如程序员自己不初始化的话的确也会被初始化,那便是不管什么类型都初始化为0,这种没有显现初始化的便是咱们这里所说的未初始化。已然都是0那么就没必要把每个0都存储起来,从而节省磁盘空间,这是BSS的主要作用)的一块内存区域。BSS是英文BlockStartedbySymbol的简称。BSS段归于静态内存分配。BSS节不不包含任何数据,仅仅简单的保护开端和完毕的地址,即总巨细。以便内存区能在运转时分配并被有效地清零。BSS节在应用程序的二进制映象文件中并不存在,即不占用磁盘空间而只在运行的时候占用内存空间,所以假如大局变量和静态变量未初始化那么其可执行文件要小许多。2、数据段(datasegment)通常是指用来寄存程序中现已初始化的大局变量和静态变量的一块内存区域。数据段归于静态内存分配,能够分为只读数据段和读写数据段。字符串常量等,但一般都是放在只读数据段中。

c
3、代码段(codesegment/textsegment)通常是指用来寄存程序执行代码的一块内存区域。这部分区域的巨细在程序运行前就现已确认,并且内存区域通常归于只读,某些架构也答应代码段为可写,即答应修正程序。在代码段中,也有或许包含一些只读的常数变量,例例如字符串常量等,但一般都是放在只读数据段中。4、堆(heap)堆是用于寄存进程运行中被动态分配的内存段,它的巨细并不固定,可动态扩张或减缩。当进程调用malloc等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张);当运用free等函数开释内存时,被开释的内存从堆中被剔除(堆被减缩)
5、栈(stack)栈又称仓库,是用户寄存程序暂时创立的部分变量,也便是说咱们函数括弧“{}”中定义的变量(但不不包含static声明的变量,static意味着在数据段中寄存变量)。除此以外,在函数被调用时,其参数也会被压入建议调用的进程栈中,并且待到调用完毕后,函数的返回值也会被寄存回栈中。因为栈的先进先出特色,所以栈特别方便用来保存/康复调用现场。从这个意义上讲,咱们能够把仓库看成一个寄存、交换暂时数据的内存区。
而四大分区的说法,则这么以为:1、堆区:由程序员手动申请,手动开释,若不手动开释,程序完毕后由体系回收,生命周期是整个程序运行期间。运用malloc或许new进行堆的申请,堆的总巨细为机器?的虚拟内存的巨细。说明:new操作符本质上是运用了malloc进行内存的申请,new和malloc的差异如下:(1)malloc是C语言中的函数,而new是C++中的操作符。(2)malloc申请之后返回的类型是void*,而new返回的指针带有类型。(3)malloc只担任内存的分配而不会调用类的结构函数,而new不仅会分配内存,并且会主动调用类的结构函数。
2、栈区:由体系进行内存的管理理。主要寄存函数的参数以及部分变量。在函数完结执行,体系自行开释栈区内存,不需要用户管理。整个程序的栈区的巨细能够在编译器?中由用户自行设定,VS中默许的栈区巨细为1M,可经过VS手动更改栈的大。64bits的Linux默许栈巨细为10MB,可经过ulimit-s暂时修正。
3、静态存储区:静态存储区内的变量在程序编译阶段现已分配好内存空间并初始化。这块内存在程序的整个运转期间都存在,它主要寄存静态变量、大局变量和常量。留意:
(1)这里不差异初始化和未初始化的数据区,是因为静态存储区内的变量若不显现初始化,则编译?会主动以默许的方式进行初始化,即静态存储区内不存在未初始化的变量。(2)静态存储区内的常量分为常变量和字符串常量,一经初始化,不可修正。静态存储内的常变量是大局变量,与部分常变量不不同,差异在于部分常变量寄存于栈,实际可间接经过指针或许引用进行修正,而大局常变量寄存于静态常量区则不能够间接修正。(3)字符串常量存储在静态存储区的常量区,字符串常量的称号即为它自身,归于常变量。(4)数据区的详细差异,有利利于咱们关于变量类型的理理解。不同类型的变量寄存的区域不同。后面将以实例代码说明这四种数据区中详细对应的变量。
4、代码区:寄存程序体的二进制代码。比方咱们写的函数,都是在代码区的。
经过上面的不同说法,咱们也能够看出,这两种说法自身没有优劣之分,详细的内存差异也跟编译器有很大的关系,因而这两种说法都是能够接受的,搞理解内存的分区之后,指针的运用才能够更更加的灵活

c语言面试题题目100及最佳答案

题目:https://blog.csdn.net/jinqg/article/details/124713675

未经允许不得转载:IT技术网站 » c语言面试题(题目100及最佳答案)
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

志在指尖 用双手敲打未来

登录/注册IT技术大全

热门IT技术

C#基础入门   SQL server数据库   系统SEO学习教程   WordPress小技巧   WordPress插件   脚本与源码下载