嵌入式面试题及解析

278 阅读4分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第8天,点击查看活动详情

1.对于整形变量A=0x12345678,请画出在little endian及big endian的方式下在内存中是如何存储的。
little endian:
高地址到低地址: 0x12
0x34
0x56
0x78
big endian

高地址到低地址: 0x78
0x56
0x34
0x12

2.中断(interrupt,如键盘中断)与异常(exception,如除零异常)有何区别?

中断一般是因为一些电信号,使CPU接收到此中断信号后,CPU停止当时的运行状态,保存CPU所处环境,执行中断响应。
异常一般是遇到了什么错误事件,CPU主动的停止运行,去处理异常。

3.局部变量能否和全局变量重名?

答:能,局部会屏蔽全局。要用全局变量,需要使用"::"
局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不
会用到全局变量。对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,
比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环
体内
4.程序的内存分配

一般分为堆、栈、静态区、常量区和程序代码区。

5.分别写出BOOL,int,float,指针类型的变量a 与“零”的比较语句。

if ( !a)
if(b

if(c>=0.0000001){设定个精度}
If(d

NULL)

6.给定一个整型变量a,写两段代码,第一个设置a的bit 3,第二个清除a 的bit 3。在以上两个操作中,要保持其它位不变。
a |= 0x1 << 3;
a &= ~0x1 << 3;

7.请写出下列代码的输出内容
#include<stdio.h>
main()
{
int a,b,c,d;
a=10;
b=a++;
c=++a;
d=10*a++;
printf(“b,c,d:%d,%d,%d”,b,c,d);
return 0;
}
b,c,d:10,12,120
8.下面这个程序执行后会有什么错误或者效果:
#define MAX 255
int main()
{
unsigned char A[MAX], i;
for (i=0;i<=MAX;i++)
A[i]=i;
}
(1)数组下标越界
(2)程序死循环了,unsigned char 这个数据类型,它占了8位,表示范围是0~255,当是255时+1会变成256也就是会变成100000000 9位,后八位就是0了。

10.用指针的方法,将字符串“ABCD1234efgh”前后对调显示
char string1[]=“ABCD1234efgh”;
char *p1 ;
char *p2 ;
int length = strlen(string1);
p1 = string1;
p2 = string1 + length - 1;
While(p1<p2)
{
char c=*p1;
*p1=*p2;
*p2=c;
P1++;
P2–;
}
printf(“string now is %s\n”, string1);
}

11.下面程序为32位CPU上运行的C程序,请计算sizeof的值。
Char aAstr[]=”hello”;
Char *p=aAstr;
Int n=10;
请计算sizeof(aAstr),sizeof§,sizeof(n);
sizeof(aAstr)=6;
sizeof§=4;
sizeof(n)=4;
12.十进制111转二级制和16进制
2进制1101111
16进制:6F

13.引用与指针有什么区别?

  1. 引用必须被初始化,指针不必。
  2. 引用初始化以后不能被改变,指针可以改变所指的对象。
  3. 不存在指向空值的引用,但是存在指向空值的指针。

14.全局变量和局部变量在内存中是否有区别?如果有,是什么区别?

全局变量储存在静态数据库,局部变量在堆栈

15.堆栈溢出一般是由什么原因导致的?

没有回收垃圾资源

16.如何引用一个已经定义过的全局变量?

答:extern

可以用引用头文件的方式,也可以用

extern关键字,如果用引用头文件方式来引用某个在头文件中声明的全局变理,假定你将那个变写错了,那么在编译期间会报错,如果你用extern方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错

17.全局变量可不可以定义在可被多个**.C****文件包含的头文件中?为什么?**

答:可以,在不同的

C文件中以static形式来声明同名全局变量。

可以在不同的C文件中声明同名的全局变量,前提是其中只能有一个C文件中对此变量赋初值,此时连接不会出错

do

……

while

while

……

do

有什么区别?

答:前一个循环一遍再判断,后一个判断以后再循环