c语言int超出范围溢出处理_C语言面试(二)

昨天分享四道嵌入式 C 语言面试题目,在发完文章后,就有好多网友说后面文章里面可不可以多搞点面试题目,暂时打算写个 5 篇左右的嵌入式面试题目,如果确实对各位有很大的帮助,后期再继续分享。


                       昨天面试题目答案

1、第一道题目的理解是,假设是在 32 位的系统上,一个内存单元就有 4 个字节,把这四个单元看成一个个放东西的“柜子”,标号分别为 1 2 3 4,那么数值 0x12345678,那么低字节上的 78 就放到第一个柜子里面去,高字节上的12放到第四个柜子里面去,其它按照顺序放。

2、第二题目,主要是考察数值溢出问题,这个比较容易发现,细心注意就行。这道题目如果面试官再进一步问的话,如果解决这个溢出问题时,你可以回答在右括号左边加一个"ul"就行,这个编译的时候就不报数据溢出警告了。

3、第三道题目,有网友说使用const关键字修饰,这个也可以这样,但是不知道各位网友有没有老司机在工作当中还有其它更好的办法来解决这个问题。

4、第四道题目可以使用#pragma pack (n) 来实现,具体想了解这个用法可以参考这篇文章——剖析c语言结构体的高级用法(二)。


                    今天面试题目分享

1、c语言里面关键static的作用是什么?(看到这个问题读者可以自己先思考一下,再看答案)

答案:


        (1)、在函数体中,一个被声明为静态的变量在这一函数被调用过程中维持其值保持不变。

        (2)、在模块内,模块就是你写的".C"文件(在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但是不能被模块外其它函数访问,它相当于一个本地的一个静态全局变量(注意它和非静态全局变量的区别哦)。

        (3)、在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。也就是说,这个函数被限制在声明它的模块本地内使用,不可以在模块外使用。

2、写一个“标准”宏,这个宏输入两个参数并返回较小的一个;同时讲出 # 与  ##的作用区别?

答案:

         (1)、第一个问题可以这样来写,注意里面使用了三目运算符:

#define  MIN(x,y)   ((x)

         (2)、"#"作用是把宏参数转化为字符串的运算符,而"##"是把两个宏参数连接的运算符:

#define  STR(arg)  #arg    

这里当参数 arg 为  hello ,则宏展开的结果是"hello"

#define  STR(arg)   name_y
#define  STR(arg)   name_##y
#define  STR(arg,arg2)   arg arg2##_##arg2##_arg2  

上面示例中,假设 arg 为  int , arg2 为 a ,则上面宏展开的结果为:

name_y
name_int
inta_a_a 

3、C语言里面关键字sizeof的作用是什么?

答案:

        (1)sizeof是在编译阶段处理,且不能被编译为机器码。还有一点,很多人会认为它是一个库函数;它的作用是计算出各种类型变量或者结构所占的字节数:

int a ,sizeof(a)
int *a,sizeof(a)
int a[10],sizeof(a)
int a[0],sizeof(a)
sizeof(void)
sizeof(void *)

上面演示结果:

4
4
40
 0
 1
4

4、请简述用户空间的内存分配及各空间保存的数据类型:

答案:

        (1) 用户空间供为3G,分为:栈空间,堆空间,数据区,代码段。

  • 栈空间保存:局部变量,函数形参,自动变量。栈空间特点,先进后出,空间由系统管理;栈空间生命周期所在函数执行结束后释放;栈空间保存的局部变量未初始化时,默认初始化为随机值。

  • 堆空间:由malloc , calloc ,ralloc,这些好函数分配的空间位堆空间,堆空间特点:先进先出,由用户管理。

  • 数据区:又分为.bss段、.data段、常量区。其中.bss段保存的是未初始化的全局变量,当全局变量未初始化时,系统默认初始化为0;常量区保存的是常量,里面保存的值不能被修改,只能做读操作;.data段是保存已经初始化的全局变量以及被static修饰的变量(静态变量)。数据区的声明周期是整个程序执行完之后再释放。

  • 代码段保存的是代码。


                                 总结

今天的分享就到这里了,希望对你有帮助,上面如有错误可以在下方留言交流或者私聊作者都可以。

a62cbc8eb03eb99629bde379fdd09b27.png


d452382df6357d98dbe108df8dc1d99c.png

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值