搜索
bottom↓
回复: 45

嵌入式C语言测试10题

[复制链接]

出0入0汤圆

发表于 2014-11-9 20:18:39 | 显示全部楼层 |阅读模式
1.局部变量是否一定有地址,用'&'是否一定能取到地址?
2.全局变量放在哪里,局部变量又放在哪里?
3.全局变量和局部变量在定义初始化时如何实现,是否可以赋一个变量值?
4.什么是堆栈,有哪些要注意的地方?
5.关键字static ,const,volatile用在什么地方,可否连用?
6.内联函数可否用函数指针访问?
7.什么样的函数不可重入,如何规避重入风险?
8.函数的参数如何传递?
9.中断函数的特殊性有哪些?
10.结构体如何对齐?

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2014-11-9 20:29:32 | 显示全部楼层
谢谢分享..........

出0入0汤圆

发表于 2014-11-9 20:33:50 | 显示全部楼层
(#‵′)(⊙o⊙)…表示只略懂得第3、4、5、8、9题

出0入0汤圆

发表于 2014-11-9 20:48:01 | 显示全部楼层
很久没用C了,忘了。

出0入0汤圆

发表于 2014-11-9 21:02:12 | 显示全部楼层
“在线求答,急”

出0入0汤圆

发表于 2014-11-9 21:08:54 | 显示全部楼层
面试题目吗

出0入0汤圆

发表于 2014-11-9 21:37:38 来自手机 | 显示全部楼层
能给出答案吗?

出0入0汤圆

发表于 2014-11-9 21:52:55 来自手机 | 显示全部楼层
坐等答案

出0入0汤圆

发表于 2014-11-9 21:58:03 | 显示全部楼层
本帖最后由 DevLabs 于 2014-11-9 22:01 编辑

我试着回答一下, 请指教.
1.局部变量是否一定有地址,用'&'是否一定能取到地址?
是的. 局部变量一定有地址. 我知道有人可能会说寄存器变量, 但是这是语言特性规定的.

2.全局变量放在哪里,局部变量又放在哪里?
全局位于bss段或data段, 局部变量位于栈上.

3.全局变量和局部变量在定义初始化时如何实现,是否可以赋一个变量值?
没看懂, 什么是 在定义初始化? 可以赋变量值.

4.什么是堆栈,有哪些要注意的地方?
代码运行时的临时数据区, 注意不要爆栈.

5.关键字static ,const,volatile用在什么地方,可否连用?
static修饰变量是表示静态变量, 修饰函数时限定访问范围.
const为只读变量.
volatile 用在程序逻辑不会直接更改, 但在中断等其它无直接逻辑关系的地方会更改变量值的地方, 可以联用.
编辑增加: volatile 可以防止编译器优化, 使得每次读写变量都使用其正确的地址.

6.内联函数可否用函数指针访问?
严格的来说是不可以的. 但至于GCC, 用某些修饰关键字时是会生成独立的代码的.

7.什么样的函数不可重入,如何规避重入风险?
有静态变量, 访问了全局变量的.  

8.函数的参数如何传递?
这个具体说什么? 不太明白, 是参数用栈传递还是寄存器?

9.中断函数的特殊性有哪些?
无参数, 无返回值.

10.结构体如何对齐?
编译器提供的关键字.

全程无Google, 如有错误, 请指教.

出0入0汤圆

发表于 2014-11-9 22:08:37 | 显示全部楼层
8,我觉得应该是传递变量的值或者传递变量的地址。

出0入0汤圆

发表于 2014-11-9 22:50:18 来自手机 | 显示全部楼层
小白飘过

出0入0汤圆

发表于 2014-11-9 23:48:10 来自手机 | 显示全部楼层
水是这样的深!

出0入0汤圆

发表于 2014-11-10 08:39:29 | 显示全部楼层
DevLabs 发表于 2014-11-9 21:58
我试着回答一下, 请指教.
1.局部变量是否一定有地址,用'&'是否一定能取到地址?
是的. 局部变量一定有地址 ...

厉害啊 在无查询的情况下 已经很牛了 我有好几题还是不太有把握 看来基本功还是不行啊

出0入0汤圆

发表于 2014-11-10 08:59:24 | 显示全部楼层
像是期末考试题

出0入0汤圆

发表于 2014-11-10 09:10:57 | 显示全部楼层
楼主,给答案链接吧,我们对下结果。

出0入0汤圆

发表于 2014-11-10 09:58:47 | 显示全部楼层
学习下!!

出0入0汤圆

 楼主| 发表于 2014-11-10 10:25:38 | 显示全部楼层
这10个问题是最近自己提出来的,没有标准答案。对于不同的C版本,不同的C编译器以及不同的CPU架构问题的答案是会有写差异的,所以回答出一部分不算难但想把问题回答全面了也很不容易。我自己也答不全,所以希望大家一同参与把答案的“BUG”都找出来。

出0入0汤圆

发表于 2014-11-10 10:32:47 | 显示全部楼层
希望楼主还有此类提问

出0入0汤圆

发表于 2014-11-10 10:41:27 | 显示全部楼层
关键是全答出来,又有什么用。。。仅仅是些基本知识而已。只能说C功底可以了。

出0入0汤圆

发表于 2014-11-10 10:53:42 | 显示全部楼层
DevLabs 发表于 2014-11-9 21:58
我试着回答一下, 请指教.
1.局部变量是否一定有地址,用'&'是否一定能取到地址?
是的. 局部变量一定有地址 ...

关于中断函数,补充下,一般需要精简,不要进行太过耗时的运算

出0入0汤圆

发表于 2014-11-10 11:38:34 | 显示全部楼层
水很深,涉世不深

出0入0汤圆

发表于 2014-11-10 12:17:14 | 显示全部楼层
既然是LZ自己出题, 可以提考虑一下 整形提升 方面的, 这绝对是一个大坑.

出0入0汤圆

发表于 2014-11-10 12:30:19 | 显示全部楼层
有点深!!!!              

出0入0汤圆

 楼主| 发表于 2014-11-10 12:39:02 | 显示全部楼层
DevLabs 发表于 2014-11-9 21:58
我试着回答一下, 请指教.
1.局部变量是否一定有地址,用'&'是否一定能取到地址?
是的. 局部变量一定有地址 ...

第一题:1.局部变量是否一定有地址,用'&'是否一定能取到地址?
我自己的答案是:局部变量不一定有地址,但用'&'一定能取到地址。
这个答案听起来就好像自相矛盾是吧。前几个问题其实是相关的。局部变量除了static修饰的是静态的,一定有地址的外,最常见的就是由CPU寄存器充当和在栈中动态分配,栈中的变量自然是有地址的,而CPU寄存器多数情况下是没有地址的。
无论局部变量在哪里都是由编译器来分配的,而当你在程序中明显的使用了某变量的地址,那编译器一定会把这个变量分配在一个有地址的空间,自然用'&'一定能取到地址。
即便是用register修饰的局部变量也不一定就是用的CPU寄存器,这个关键字只是告诉编译器尽量的由CPU寄存器充当将此变量。

出0入0汤圆

 楼主| 发表于 2014-11-10 12:42:02 | 显示全部楼层
专注XXOO三十年 发表于 2014-11-10 10:41
关键是全答出来,又有什么用。。。仅仅是些基本知识而已。只能说C功底可以了。 ...

也就是引发一下大家对C的深入思考。其实考的不只是C语言还有对计算机原理的理解。

出0入8汤圆

发表于 2014-11-10 12:46:16 来自手机 | 显示全部楼层
中断函数其实也可以带参数和返回值的
比如stm32的 svc

出0入8汤圆

发表于 2014-11-10 12:47:38 来自手机 | 显示全部楼层
有的编译器不会把局部变量放在栈上
而是用静态分析的技术静态分配

出0入0汤圆

 楼主| 发表于 2014-11-10 12:52:48 | 显示全部楼层
canspider 发表于 2014-11-10 12:47
有的编译器不会把局部变量放在栈上
而是用静态分析的技术静态分配

没错,这就是问题2的答案之一。

出0入0汤圆

 楼主| 发表于 2014-11-10 12:55:09 | 显示全部楼层
canspider 发表于 2014-11-10 12:46
中断函数其实也可以带参数和返回值的
比如stm32的 svc

这个也是对的,问题8搞明白这个也就好理解了

出0入0汤圆

发表于 2014-11-10 13:56:33 | 显示全部楼层
从哪里整滴,面试题?

出0入0汤圆

发表于 2014-11-10 15:59:25 | 显示全部楼层
科技猎人 发表于 2014-11-10 12:39
第一题:1.局部变量是否一定有地址,用'&'是否一定能取到地址?
我自己的答案是:局部变量不一定有地址, ...

是的,我的意思是若取地址的话一定是有地址的,并且能够取到。

出0入0汤圆

发表于 2014-11-10 16:06:22 | 显示全部楼层
感觉自己也不会!

出0入0汤圆

发表于 2014-11-10 16:24:40 来自手机 | 显示全部楼层
canspider 发表于 2014-11-10 12:47
有的编译器不会把局部变量放在栈上
而是用静态分析的技术静态分配

如果静态分配会不会更占内存?

出0入0汤圆

发表于 2014-11-10 16:35:58 | 显示全部楼层
10个题 一个都不会

出0入0汤圆

发表于 2014-11-10 22:23:13 | 显示全部楼层
DevLabs 发表于 2014-11-10 12:17
既然是LZ自己出题, 可以提考虑一下 整形提升 方面的, 这绝对是一个大坑.

感觉绝大多数问题可以这样避免:
1.数据类型转换,不确定的情况下,与一下掩码;
2.左操作数尽可能使用大容量类型,避免运算中溢出;
3.老实地判数值溢出问题,正数溢出不一定就是负数;
4.底层的二进制数据转换要用指针,例如把float的四个字节dump出来;

出0入0汤圆

发表于 2014-11-11 10:34:45 | 显示全部楼层
DevLabs 发表于 2014-11-9 21:58
我试着回答一下, 请指教.
1.局部变量是否一定有地址,用'&'是否一定能取到地址?
是的. 局部变量一定有地址 ...

全局变量初始化时不能给其赋值一个变量,否则编译器会报错。局部变量初始化,可以赋值一个变量。

出0入0汤圆

发表于 2014-11-11 11:55:07 | 显示全部楼层
膜拜各位大神,真正自己来回答估计答不全几个。

出0入0汤圆

发表于 2014-11-11 12:15:42 | 显示全部楼层
Gallen.Zhang 发表于 2014-11-11 10:34
全局变量初始化时不能给其赋值一个变量,否则编译器会报错。局部变量初始化,可以赋值一个变量。 ...

疏忽了, 你是对的.

出0入0汤圆

 楼主| 发表于 2014-11-11 12:40:04 | 显示全部楼层
DevLabs 发表于 2014-11-9 21:58
我试着回答一下, 请指教.
1.局部变量是否一定有地址,用'&'是否一定能取到地址?
是的. 局部变量一定有地址 ...

关于问题:4.什么是堆栈,有哪些要注意的地方?
这个问题本身就是个陷阱。堆栈包括‘堆’和‘栈’两部分,堆用于动态内存分配,由程序员来控制,使用过的空间一定要释放,否则会造成内存泄漏。
栈主要用于函数调用(包括被异步调用的中断函数)时的现场保护(及当前的CPU寄存器和一些局部变量),主要由编译器和CPU来控制,有时程序员也可以通过汇编或指针等方式人为操作,不要冒栈。
欢迎大家指正和补充。

出0入4汤圆

发表于 2014-11-11 13:39:42 | 显示全部楼层
写的代码不用费什么功夫调试即可通过编译、运行与测试,但你的题我都答不全

出0入0汤圆

发表于 2014-11-11 17:53:10 | 显示全部楼层
科技猎人 发表于 2014-11-11 12:40
关于问题:4.什么是堆栈,有哪些要注意的地方?
这个问题本身就是个陷阱。堆栈包括‘堆’和‘栈’两部分 ...

实际上我感觉我们常说的堆栈指代就是栈(stack), 当然严格的来说堆(heap)和栈(stack)根本就不是一回事.

出0入17汤圆

发表于 2014-11-12 20:18:37 | 显示全部楼层
想起了大学考试,大多把程序写溜了的,考试都被概念卡死了···!

出0入0汤圆

发表于 2014-11-12 20:32:06 | 显示全部楼层
科技猎人 发表于 2014-11-11 12:40
关于问题:4.什么是堆栈,有哪些要注意的地方?
这个问题本身就是个陷阱。堆栈包括‘堆’和‘栈’两部分 ...

补充一点:如何用RTOS的话,我们的栈就在我们为任务分配的堆中了。

出870入263汤圆

发表于 2014-11-12 21:39:36 | 显示全部楼层
这些题是值得C程序员好好思考,以反省、认识自己的基本功到底如何。通常,这些题大家能回答出部分或者全部,但是回答得肯定是不够完整的!别秀出来,不妨自己偷偷测试,没把握的再来提问讨论。这是个很好的帖子!
我从前发过一个关于“整型提升”的帖子,一起拿过来:
http://www.amobbs.com/thread-5572814-1-1.html

出0入0汤圆

发表于 2014-11-12 23:21:50 来自手机 | 显示全部楼层
又温习了一遍

出0入0汤圆

 楼主| 发表于 2015-10-8 14:33:21 | 显示全部楼层
Gallen.Zhang 发表于 2014-11-11 10:34
全局变量初始化时不能给其赋值一个变量,否则编译器会报错。局部变量初始化,可以赋值一个变量。 ...

定义时初始化即如 int  n=5;这样的情况。
是这样的,非静态的局部变量可以赋一个变量值,而静态变量(全局变量一定是静态变量)则不可以赋一个变量值。呢为什么呢?
动态变量是函数在调用时由编译器决定的使用哪个物理实体来作为变量载体,可以是CPU寄存器,也可以是参考当前栈指(SP)指定的部分栈空间(内存空间的一部分),甚至可以是一些静态内存空间(查查C51编译器是如何分配局部变量的)。总之动态变量是临时借用一些电路实体来实现数据存取的,用过之后就不再霸占这些实体了。所以动态变量只要在调用前赋给初值即可,且每次进入所属函数都要初始化一次。对于无初始值的动态变量其临时的实体内也是会有一个数值的,但这个值对程序员来讲是随机的,这也是为什么好多程序不初始化局部变量会出现奇怪故障的原因。
对于静态变量,它会永久占用一段内存空间作为存储实体,它不像动态变量要在每次使用前都要初始化一次,它只在进入main函数前初始化一次。由汇编编写的复位向量代码中会调用一个叫__main的函数,该函数由编译器生成,里面就会完成静态变量的初始化工作。
对于静态变量需要非零初始化的会分配到data段,无初始化或初始化为零的则分配到bss段。对于bss段的初始化直接清零操作即可,对于bss段的初始化则要在固件的末尾添加一个bss段初始化值的映像,在__main函数中把该映像拷贝到bss段,如果映像比较大可以进行压缩再解压到bss段。
这样静态变量的初始值是在源程序编译完后就必须已知的,而动态变量则没有这个限制。

对于const修饰的变量,本身是指的不可修改的变量,而不是常量。按理静态或动态都可以,但大部分编译器为了节省RAM资源,会将其优化到内存空间的ROM区域中,这样一但烧写完程序它就可以读取访问了,也不存在运行中的初始化过程了。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-16 15:31

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表