c语言进程(c的常见面试题与陷阱题)

面试题1.0

 问:该试题的答案是什么?并说出这个结果的原因。

答案:无限循环打印“ hehe ”。

 

这是很常见的一道面试题,考得不难且考点只有一个。就是关于数组越界。

1. 首先在内存中创建空间是从高地址到低地址的,这称为压栈。而在vs2019,vs2013等环境之下,压栈创建的空间是隔开两块内存(int类型)的。

2.那么当访问的到a[12]的时候,a[12] = i = 0;即 i 重新被赋值为0。那么将死循环打印hehe。

3.类似的在gcc环境下压栈空出一块内存(4个字节),vc6.0则没有空

解决办法:

最好的办法就是不要写出越界的代码。其二就是先创建数组,再创建i,这样数组从低到高循环就不会访问到 i 所在的地址(debug版本下)。release版本下会自动被优化成先创建数组。

回答话术:原因局部变量在内存中创建是由高地址到地址值创建的,而数组的下标的增长在内存中是低到高增长的。
那么i在内存中就会在数组的上方。如果i和arr数组中间留的空间合适的话那么数组越界访问就可能访问到i。
那么对i的赋值0就会导致数组进入死循环。
 

陷阱题1.0(sizeof算术转换陷阱)

问:答案是什么?为什么?

答案: i > sizeof( i )

考点:算术转换(在为int类型以上的变量进行运算时。低级类型将会转换为高类型再进行运算)

 解析:

由于sizeof的返回类型是size_t,他的本质是unsigned类型。而unsigned int 的级别比int级别要高。那么当他们运算时就会进行算术转换。-1 = 4294967295(32位下的无符号)。sizeof(i) = sizeof(int) = 4。所以 i > sizeof( i )。

算术转换等级:

 

以上是本章的全部内容,均是本人的一些浅薄见解

自己深知自我的知识储备还比较有限

如有理解不恰当之处,望各位指正

2021.11.28

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>