C语言经典面试题

持续收集中...

 

1 数组名与一般的指针有哪些区别?

数组名是内存块的首地址,它是一个常量指针。使用sizeof测试数组时得到的数组所占的空间大小,即元素占的空间*数组长度。

2 inline函数的好处?

节省调用开销;相对于宏展开,inline发生在编译阶段,会做类型检查。

3 C语言中static关键字的作用?

作用于局部变量时: 叫静态局部变量,在函数调用时,只有在该函数第一次调用时才对其分配空间和初始化。在函数调用结束时,不对该变量的内存进行释放,值仍然保留。这也是于自动变量的区别。

作用于全局变量时:叫静态全局变量。表示该变量是私有的,只能在该文件使用。不能通过extern关键字对其引用。

作用于函数时:叫静态函数,表示该函数是私有的,只能在本文件中使用,不能通过extern关键字对其引用

4 C语言中volatile关键字的作用?

volatile本意是可变的,使用volatile声明的变量要求在被系统访问时总是重新从它所在的内存读取数据,使得编译器对访问该变量的代码不再进行优化,从而可以提供对特殊地址的稳定访问。

5 指针函数与函数指针的区别?

指针函数是指带指针的函数,即本质是一个函数,其返回类型是某一类型的指针;函数指针是指向函数的指针变量,即本质是一个指针变量。

6 左值与右值的区别?

左值指的是可以取地址的变量,左值与右值的根本区别在于能否获取内存地址。

7 大小端模式?

大端模式:是指数据的高字节保存在内存的低地址中;
小端模式:是指数据的高字节保存在内存的高地址中; 

8 经常要操作的内存分为那几个类别?

栈、堆、全局区(静态区)、字符串常量区、程序代码区。

9 内存碎片是如何产生的?

内存碎片指的是系统中不可用的空闲内存,一般是由于内存对齐导致的。

10 野(wild)指针与悬空(dangling)指针有什么区别?如何避免?

野指针(wild pointer):就是没有被初始化过的指针。⽤ gcc -Wall 编译, 会出现used uninitialized警告。
悬空指针:是指针最初指向的内存已经被释放了的⼀种指针。
⽆论是野指针还是悬空指针,都是指向⽆效内存区域(这里的无效指的是“不安全不可控”)的指针。访问“不安全可控”(invalid)的内存区域将导致“Undefined Behavior”。
注:如何避免使⽤野指针?在平时的编码中,养成在定义指针后且在使⽤之前完成初始化的习惯或者使⽤C++智能指针。
11 内存对齐的作用?
提高访存速度,提高可移植性。
经过内存对⻬之后,CPU的内存访问速度大大提升。因为CPU是把内存当成⼀块⼀块的,块的⼤⼩可以是2/4/8/16个字节,因此CPU在读取内存的时候是⼀块⼀块进⾏读取的,块的大小称为内存读取粒度。比如说CPU要读取⼀个4个字节的数据到寄存器中(假设内存读取粒度是4),如果数据是从0字节开始的,那么直接将0-3四个字节完全读取到寄存器中进⾏处理即可。如果数据是从1字节开始的,就⾸先要将前4个字节读取到寄存器,并再次读取4-7个字节数据进⼊寄存器,接着把0字节,5、6、7 字节的数据剔除,最后合并1、2、3、4字节的数据进⼊寄存器,所以说,当内存没有对⻬时,寄存器进行了很多额外的操作,大大降低了CPU的性能。
另外,还有⼀个就是,有的CPU遇到未进⾏内存对⻬的处理直接拒绝处理,不是所有的硬件平台都能访问任意地址上的任意数据,某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。所以内存对⻬还有利于平台移植。
12 如何判断浮点变量取值是否为0(两个浮点数是否相等)?
float的精度误差在1e-6,double精度误差在1e-15,因此:
判断float型数是否相等:if(fabs(a - b) < 1e-6);
判断一个double型数是否相等:if(fabs(a - b) < 1e-15);
posted @ 2019-10-01 18:22  Pepetang  阅读(1554)  评论(0编辑  收藏  举报