嵌入式C语言面试题

1、读程序,回答问题

int main(int argc,char *argv[])
{
int c=9,d=0;
c=c++%5;
d=c;
printf("d=%d\n",d);
return 0;
}

a)、写出程序的结果;

b)、在一个可移植的系统中这种表达式是否存在风险?why?

答:a)、4

        b)、存在风险,因为c=c++%5;在这个表达式中,对C有两次修改,行末未定义,c的值不明确。

2、#include "stdio.h"
int a=0;    //data section
int b;    //data  section
static char c;   //BSS
int main(int arg c,char *argv[])
{
char d=4;   //stack
static short e;//BSS
a++;
b=100;
c=(char)++a;
e=(++d)++;
printf("a=%d, b=%d, c=%d, d= %d, e=%d",a,b,c,d,e);
return 0;
}

a) 写出程序输出
b) 编译器如果安排各个变量(a,b,c,d)在内存中的布局(eg. stack,heap,data section,bss section),最好用图形方式描述。
答: a=2  b=100  c=2   d=6   e=5

3 C/C++基础知识问题

a) 关键字volatile在编译时有什么含义?并给出三个不同使用场景的例子(可以伪代码或者文字描述)。
b) C语言中static关键字的具体作用有哪些 ?
c) 请问下面三种变量声明有何区别?请给出具体含义

 

int const *p;
int* const p;
int const* const p;

答:a)、用volatile关键字定义变量,相当于告诉编译器,这个变量的值会随时发生变化,每次使用的时候都需要去内存里面

重新读取他的值,并不要随意去针对他做优化。

建议使用volatile关键字的地方:

1、并行设备的硬件寄存器

2、一个中断服务子程序中会访问到的非自动变量

3、多线程应用中被几个任务共享的非自动变量

b) 在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。
     在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。
     在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。
     static全局变量与普通的全局变量有什么区别:static全局变量只初使化一次,防止在其他文件单元中被引用;
     static局部变量和普通局部变量有什么区别:static局部变量只被初始化一次,下一次依据上一次结果值;
     static函数与普通函数有什么区别:static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝
  c) 一个指向常整型数的指针
     一个指向整型数的常指针
     一个指向常整型数的常指针


4 嵌入式系统相关问题
a) 对于整形变量A=0x12345678,请画出在little endian及big endian的方式下在内存中是如何存储的。
b) 在ARM系统中,函数调用的时候,参数是通过哪种方式传递的?
c) 中断(interrupt,如键盘中断)与异常(exception,如除零异常)有何区别?

a)

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

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

 

b)参数<=4时候,通过R0~R3传递,>4的通过压栈方式传递。具体参数传递见下一篇。

c)   异常:在产生时必须考虑与处理器的时钟同步,实践上,异常也称为同步中断。在处理器执行到由于编程失误而导致的错误指令时,或者在执行期间出现特殊情况(如缺页),必须靠内核处理的时候,处理器就会产生一个异常。
所谓中断应该是指外部硬件产生的一个电信号,从cpu的中断引脚进入,打断cpu当前的运行;
所谓异常,是指软件运行中发生了一些必须作出处理的事件,cpu自动产生一个陷入来打断当前运行,转入异常处理流程。

 

阅读更多
个人分类: 收集
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭