【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

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值