嵌入式面试题(转)
2013-11-22 11:03
99 查看
1. 输出什么?
int a = (1,2);
printf("a=%d\n",a);
答:a=2,逗号表达式的赋值
2. struct value {
char a[3];
short b;
};
struct value temp;
printf("sizeof(temp) is %d\n", sizeof(temp));
答:sizeof(temp) is 6
3.编写程序交换a,b的值(使用二种方法)
void swap(int *a, int *b)
{
int temp;
temp = *a;
*a = *b;
*b = temp;
}
void swap(int *a, int *b)
{
*a = *a + *b;
*b = *a - *b;
*a = *a - *b;
}
4. 说明int *p[5]和int(*p)[5]的区别
答:int *p[5]是指针数组,数组里存储的是指针
(*p)[5]是数组指针,指向一个含有5个数的数组
5. 编写函数实现链表的创建,节点的插入和删除
typedef struct node
{
int num;
struct node *next;
}Node;
Node *create()
{
Node *p, *head;
int n;
head = (Node *)malloc(sizeof(Node));
head->next = NULL;
scanf("%d", &n);
while(n > 0) {
p = (Node *)malloc(sizeof(Node));
p->num = n;
p->next = head->next;
head->next = p;
scanf("%d", &n);
}
return head;
}
Node *insert(Node *head, int pos, int num)
{
Node *p, *pre;
int i=1;
pre = head;
while(pre->next && i < pos)
{
pre = pre->next;
i++;
}
p = (Node *)malloc(sizeof(Node));
p->num = num;
p->next = pre->next;
pre->next = p;
return head;
}
Node *delete(Node *head, int num)
{
Node *p, *pre;
p = head->next;
while(p->num != num) {
pre = p;
p = p->next;
}
if (p->num == num) {
pre->next = p->next;
free(p);
}
return head;
}
6. 说明如下两片代码的区别
char *p = "love linux";
char p[] = "love linux";
答:*p中的p是一个指针,指向一片只读的字符串
p[] 是一个数组,该数组被初始化
7.用C语言实现一相n!函数(要求用递归实现)
long fact(int n)
{
if (n==0 || n==1) {
return 1;
}
if(n > 1) {
return n*fact(n-1);
}
}
8. char c;
char b[20] = "I love Linux";
c = 'I'与C=“I” 有什么区别,字符串b在内存占几个字节
答:c = 'I'是一个字符,c = "I" 是一个字符串,从对数组b的定义
可知,b在内存中占有20个字节(与它进行初始化的字符串长度无关)
9. 实现自己的mystrcat()函数
char *mystrcat(char *dst, const char *src)
{
char *cp;
cp = dst;
while (*cp)
cp ++;//指针指向字符串尾
while(*cp++ = *src++);//每次循环最后一次拷贝了"\0"
return dst;
}
10. char str[20];
scanf("%s", str);
printf("%s", str);
如果输入I love linux回车,结果输出什么?为什么?
答:输出I,因为scanf输入字符串不能有空格
11. 已知两个整型数组均为升序排列,将两个数组合并,且合并后仍按升序排序
//m为数组a的长度,n为数组b的长度,c是指向新开辟的数组
void combin(int *a, int *b, int *c, int m, int n)
{
int *p1, *p2, *p3;
for(p1 = a, p2 = b, p3 = c; p1 < a+m && p2 < b+n;)
{
if (*p1 < *p2)
*p3++ = *p1++;
else
*p3++ = *p2++;
}
while(p1 < a+m) *p3++ = *p1++;
while(p2 < b+n) *p3++ = *p2++;
}
[csharp] view
plaincopy
1.用指令#define 声明一个常数,用于表明1年中用多少秒(忽略闰年问题)
答:#define SECOND_PER_YEAR (60*60*24*365)UL
2.写一个标准的宏MIN,这个宏输入两个参数,并返回较小的一个
答:#define MIN(a,b) ((a) > (b) ? (a) : (b))
3.嵌入式系统中经常用到的无限循环,用C写死循环
while(1)
{
}
4.数据声明,用变量a给出下面的定义
1)一个整型数
int a;
2)一个指向整型数的指针
int *a;
3)一个指向指针的指针,它指向的指针是指向一个整形数
int **a;
4)一个有10个整形数的数组
int a[10];
5)一个有10个指针的数组,该指针是指向一个整形数的
int *a[10];
6)一个指向有10个整形数组的指针
int (*a)[10];
7)一个指向函数的指针,该函数有一个整形参数并返回一个整形数
int (*a)(int);
8)一个有10个指针的数组,该指针指向一个函数,该函数有一个整形参数并返回一个整形数
int (*a[10])(int);
5.关键字static的作用
答:1)在函数体,一个被声明为静态的变量在这一函数被调用的过程中维持其值不变
int fun()
{
static int a = 5;//在5的基础上累加
a ++;
return a;
}
2)在模块内(但在函数体外)一个被声明为静态的变量可以被模块内所有函数访问但不能被模块外的
其它函数访问。
3)在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用
6.关键字const有什么含意
答:const可以保护不希望被改变的变量参数
const int a;
a是一个常整形(把类型去掉,保护最近的那个)
const int *a;(*a不可修改,a可以修改)a是一个指向常整形的指针
int *const a; (a不可修改,*a可以修改) a是一个指向整形的常指针
int const *a const;(*a和a都不可以修改)a是一个指向常整形的常指针
7.关键字volatile有什么含意,并给出三个不同的例子
答:防止变量被优化,优化器在处理被volatile修饰的变量时,会重新
读取这个变量的值,而不是使用保存在寄存器里的备份(可能被意想不到的改变)
1)并行设备的硬件寄存器(状态寄存器)
2)一个中断服务子程序中会访问到的非自动变量
3)多线程应用中被几个任务共享的变量
8.一个参数可以是const还可以是volatile吗
答:可以,只读状态寄存器,它是volatile因为它可能被意想不到地改变,
它是const因为程序不应该试图去修改它
9. int square(volatile int *ptr)
{
return *ptr * *ptr;
}函数有什么错误
答:*ptr的值可能被意想不到的改变,返回值不是期望的平方值
改:
long square(volatile int *ptr)
{
int a;
a = *ptr;
return a * a;
}
10. 位操作
给定一个整形变量a,写两片代码,第一个设置a的bit 3,第二个清除a的 bit 3
在以上两个操作中,要保持其它位不变
答:#define BIT3 (0x1 << 3)
static int a;
void set_bit3(void)
{
a | = BIT3;
}
void clear_bit3(void)
{
a &= ~BIT3;
}
11.访问固定的内存位置
嵌入式系统经常要求程序员去访问特定的内存位置的点,要求设置一绝对地址为0x6780的整型
变量的值为0x5566
答: int *p;
p = (int *)0x6780;
*p = 0x5566;
(访问绝对地址把一个整型,强制转换成一个指针是合法的)
12.中断服务程序ISR(请评论)
__interrupt double compute_area(doble radius)
{
double area = PI*radius*radius;
printf("\n AREA = %f", area);
return area;
}
答:1)ISR不能返回值
2)ISR不能传递参数
3)有些编译器不允许在ISR中做浮点运算
4)printf有重入性问题
13. 下面代码输出什么?为什么?
void foo(void)
{
unsigned int a = 6;
int b = -20;
(a+b > 6) ? puts("> 6") : puts("<=6");
}
答:输出>6,因为表达式中有符号和无符号类型时,所有操作
数都自动转换为无符号型
14.评价下面的代码
unsigned int zero = 0;
unsigned int compzero = 0xFFFF;
答:对一个int 型不是16位的处理器不正确
unsigned int compzero = ~0;
[csharp] view
plaincopy
1.局部变量能否和全局变量重名?
答:能,局部会屏蔽全局
2.如何引用一个已经定义过的全局变量
答:extern
3.全局变量可不可以定义在可被多个.c文件包含的头文件中?
答:可以,在不同的c文件中以static形式来声明同名全局变量
4.语句for(; 1; )有什么问题?它是什么意思
答:死循环
5.程序中,全局变量、静态变量存在于(全局数据区)
局部变量存在于(堆栈中),动态申请数据存在于(堆)中
6.队列和栈有什么区别?
答:队列先进先出,栈后进先出
7.对于一个频繁使用的短小函数,在C语言中用什么实现,C++中呢?
答:C用宏定义,C++用inline
8.确定模块的功能和模块的接口是在软件设计的那个时期完成的
答:概要设计
9.引用和指针有什么区别?
答:1)引用必须被初始化,指针不必
2)引用初始化以后不能被改变,指针可以改变所指的对象
3)不存在指向空值的引用,存在指向空值的指针
10.RTOS的基本特性
答:实时性与可靠性
11.什么是平衡二叉树?
答:左右子树都是平衡二叉树,且左右子树的深度差的绝对值小于1
12.堆栈溢出一般是由什么原因导致的?
答:没有回收垃圾资源
13.构造函数不能声明为虚函数
14.Internet采用哪种网络协议?该协议主要层次结构?
答:TCP/IP,应用层、传输层、网络层、物理层(数据链路层)
15.Internet物理地址和IP地址转换采用什么协议?
答:ARP(地址解析协议)
16.请定义一个宏,比较两个数a,b的大小,不能使用大于,小于,if语句
答:#define MAX(a,b) (a/b) ? a:b
17.写一个病毒
while(1)
{
int *p = new int[100000000];
}
18.求一个字符串的长度,两种方法
int mystrlen(char *s)
{
int len = 0;
while(*s++)
len++;
return len;
}
int mystrlen(char *s)
{
char *str = s;
while(*str)
str++;
return (str - s);
}
19.字符串复制
char *mystrcpy(char *dst, const char *src)
{
char *ret = dst;
while(*ret++ = *src++);
return dst;
}
20.内存复制
void *mymemcpy(void *_dst, const void *_src, unsigned len)
{
unsigned char *dst= _dst;
const unsigned char *src = _src;
while(len-- > 0)
{
*dst++ = *src++;
}
return _dst;
}
int a = (1,2);
printf("a=%d\n",a);
答:a=2,逗号表达式的赋值
2. struct value {
char a[3];
short b;
};
struct value temp;
printf("sizeof(temp) is %d\n", sizeof(temp));
答:sizeof(temp) is 6
3.编写程序交换a,b的值(使用二种方法)
void swap(int *a, int *b)
{
int temp;
temp = *a;
*a = *b;
*b = temp;
}
void swap(int *a, int *b)
{
*a = *a + *b;
*b = *a - *b;
*a = *a - *b;
}
4. 说明int *p[5]和int(*p)[5]的区别
答:int *p[5]是指针数组,数组里存储的是指针
(*p)[5]是数组指针,指向一个含有5个数的数组
5. 编写函数实现链表的创建,节点的插入和删除
typedef struct node
{
int num;
struct node *next;
}Node;
Node *create()
{
Node *p, *head;
int n;
head = (Node *)malloc(sizeof(Node));
head->next = NULL;
scanf("%d", &n);
while(n > 0) {
p = (Node *)malloc(sizeof(Node));
p->num = n;
p->next = head->next;
head->next = p;
scanf("%d", &n);
}
return head;
}
Node *insert(Node *head, int pos, int num)
{
Node *p, *pre;
int i=1;
pre = head;
while(pre->next && i < pos)
{
pre = pre->next;
i++;
}
p = (Node *)malloc(sizeof(Node));
p->num = num;
p->next = pre->next;
pre->next = p;
return head;
}
Node *delete(Node *head, int num)
{
Node *p, *pre;
p = head->next;
while(p->num != num) {
pre = p;
p = p->next;
}
if (p->num == num) {
pre->next = p->next;
free(p);
}
return head;
}
6. 说明如下两片代码的区别
char *p = "love linux";
char p[] = "love linux";
答:*p中的p是一个指针,指向一片只读的字符串
p[] 是一个数组,该数组被初始化
7.用C语言实现一相n!函数(要求用递归实现)
long fact(int n)
{
if (n==0 || n==1) {
return 1;
}
if(n > 1) {
return n*fact(n-1);
}
}
8. char c;
char b[20] = "I love Linux";
c = 'I'与C=“I” 有什么区别,字符串b在内存占几个字节
答:c = 'I'是一个字符,c = "I" 是一个字符串,从对数组b的定义
可知,b在内存中占有20个字节(与它进行初始化的字符串长度无关)
9. 实现自己的mystrcat()函数
char *mystrcat(char *dst, const char *src)
{
char *cp;
cp = dst;
while (*cp)
cp ++;//指针指向字符串尾
while(*cp++ = *src++);//每次循环最后一次拷贝了"\0"
return dst;
}
10. char str[20];
scanf("%s", str);
printf("%s", str);
如果输入I love linux回车,结果输出什么?为什么?
答:输出I,因为scanf输入字符串不能有空格
11. 已知两个整型数组均为升序排列,将两个数组合并,且合并后仍按升序排序
//m为数组a的长度,n为数组b的长度,c是指向新开辟的数组
void combin(int *a, int *b, int *c, int m, int n)
{
int *p1, *p2, *p3;
for(p1 = a, p2 = b, p3 = c; p1 < a+m && p2 < b+n;)
{
if (*p1 < *p2)
*p3++ = *p1++;
else
*p3++ = *p2++;
}
while(p1 < a+m) *p3++ = *p1++;
while(p2 < b+n) *p3++ = *p2++;
}
[csharp] view
plaincopy
1.用指令#define 声明一个常数,用于表明1年中用多少秒(忽略闰年问题)
答:#define SECOND_PER_YEAR (60*60*24*365)UL
2.写一个标准的宏MIN,这个宏输入两个参数,并返回较小的一个
答:#define MIN(a,b) ((a) > (b) ? (a) : (b))
3.嵌入式系统中经常用到的无限循环,用C写死循环
while(1)
{
}
4.数据声明,用变量a给出下面的定义
1)一个整型数
int a;
2)一个指向整型数的指针
int *a;
3)一个指向指针的指针,它指向的指针是指向一个整形数
int **a;
4)一个有10个整形数的数组
int a[10];
5)一个有10个指针的数组,该指针是指向一个整形数的
int *a[10];
6)一个指向有10个整形数组的指针
int (*a)[10];
7)一个指向函数的指针,该函数有一个整形参数并返回一个整形数
int (*a)(int);
8)一个有10个指针的数组,该指针指向一个函数,该函数有一个整形参数并返回一个整形数
int (*a[10])(int);
5.关键字static的作用
答:1)在函数体,一个被声明为静态的变量在这一函数被调用的过程中维持其值不变
int fun()
{
static int a = 5;//在5的基础上累加
a ++;
return a;
}
2)在模块内(但在函数体外)一个被声明为静态的变量可以被模块内所有函数访问但不能被模块外的
其它函数访问。
3)在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用
6.关键字const有什么含意
答:const可以保护不希望被改变的变量参数
const int a;
a是一个常整形(把类型去掉,保护最近的那个)
const int *a;(*a不可修改,a可以修改)a是一个指向常整形的指针
int *const a; (a不可修改,*a可以修改) a是一个指向整形的常指针
int const *a const;(*a和a都不可以修改)a是一个指向常整形的常指针
7.关键字volatile有什么含意,并给出三个不同的例子
答:防止变量被优化,优化器在处理被volatile修饰的变量时,会重新
读取这个变量的值,而不是使用保存在寄存器里的备份(可能被意想不到的改变)
1)并行设备的硬件寄存器(状态寄存器)
2)一个中断服务子程序中会访问到的非自动变量
3)多线程应用中被几个任务共享的变量
8.一个参数可以是const还可以是volatile吗
答:可以,只读状态寄存器,它是volatile因为它可能被意想不到地改变,
它是const因为程序不应该试图去修改它
9. int square(volatile int *ptr)
{
return *ptr * *ptr;
}函数有什么错误
答:*ptr的值可能被意想不到的改变,返回值不是期望的平方值
改:
long square(volatile int *ptr)
{
int a;
a = *ptr;
return a * a;
}
10. 位操作
给定一个整形变量a,写两片代码,第一个设置a的bit 3,第二个清除a的 bit 3
在以上两个操作中,要保持其它位不变
答:#define BIT3 (0x1 << 3)
static int a;
void set_bit3(void)
{
a | = BIT3;
}
void clear_bit3(void)
{
a &= ~BIT3;
}
11.访问固定的内存位置
嵌入式系统经常要求程序员去访问特定的内存位置的点,要求设置一绝对地址为0x6780的整型
变量的值为0x5566
答: int *p;
p = (int *)0x6780;
*p = 0x5566;
(访问绝对地址把一个整型,强制转换成一个指针是合法的)
12.中断服务程序ISR(请评论)
__interrupt double compute_area(doble radius)
{
double area = PI*radius*radius;
printf("\n AREA = %f", area);
return area;
}
答:1)ISR不能返回值
2)ISR不能传递参数
3)有些编译器不允许在ISR中做浮点运算
4)printf有重入性问题
13. 下面代码输出什么?为什么?
void foo(void)
{
unsigned int a = 6;
int b = -20;
(a+b > 6) ? puts("> 6") : puts("<=6");
}
答:输出>6,因为表达式中有符号和无符号类型时,所有操作
数都自动转换为无符号型
14.评价下面的代码
unsigned int zero = 0;
unsigned int compzero = 0xFFFF;
答:对一个int 型不是16位的处理器不正确
unsigned int compzero = ~0;
[csharp] view
plaincopy
1.局部变量能否和全局变量重名?
答:能,局部会屏蔽全局
2.如何引用一个已经定义过的全局变量
答:extern
3.全局变量可不可以定义在可被多个.c文件包含的头文件中?
答:可以,在不同的c文件中以static形式来声明同名全局变量
4.语句for(; 1; )有什么问题?它是什么意思
答:死循环
5.程序中,全局变量、静态变量存在于(全局数据区)
局部变量存在于(堆栈中),动态申请数据存在于(堆)中
6.队列和栈有什么区别?
答:队列先进先出,栈后进先出
7.对于一个频繁使用的短小函数,在C语言中用什么实现,C++中呢?
答:C用宏定义,C++用inline
8.确定模块的功能和模块的接口是在软件设计的那个时期完成的
答:概要设计
9.引用和指针有什么区别?
答:1)引用必须被初始化,指针不必
2)引用初始化以后不能被改变,指针可以改变所指的对象
3)不存在指向空值的引用,存在指向空值的指针
10.RTOS的基本特性
答:实时性与可靠性
11.什么是平衡二叉树?
答:左右子树都是平衡二叉树,且左右子树的深度差的绝对值小于1
12.堆栈溢出一般是由什么原因导致的?
答:没有回收垃圾资源
13.构造函数不能声明为虚函数
14.Internet采用哪种网络协议?该协议主要层次结构?
答:TCP/IP,应用层、传输层、网络层、物理层(数据链路层)
15.Internet物理地址和IP地址转换采用什么协议?
答:ARP(地址解析协议)
16.请定义一个宏,比较两个数a,b的大小,不能使用大于,小于,if语句
答:#define MAX(a,b) (a/b) ? a:b
17.写一个病毒
while(1)
{
int *p = new int[100000000];
}
18.求一个字符串的长度,两种方法
int mystrlen(char *s)
{
int len = 0;
while(*s++)
len++;
return len;
}
int mystrlen(char *s)
{
char *str = s;
while(*str)
str++;
return (str - s);
}
19.字符串复制
char *mystrcpy(char *dst, const char *src)
{
char *ret = dst;
while(*ret++ = *src++);
return dst;
}
20.内存复制
void *mymemcpy(void *_dst, const void *_src, unsigned len)
{
unsigned char *dst= _dst;
const unsigned char *src = _src;
while(len-- > 0)
{
*dst++ = *src++;
}
return _dst;
}
相关文章推荐
- 一道嵌入式工程师面试题
- 嵌入式面试题
- 嵌入式经典面试题
- 嵌入式开发—C语言面试题
- 嵌入式面试题汇总
- 嵌入式C 面试题
- 嵌入式岗位经典面试题(focus on c language)
- 16道嵌入式C语言面试题(修正并加注)
- 嵌入式linux面试题解析(二)——C语言部分一
- 嵌入式C/C++面试题(转帖)
- 嵌入式开发C语言面试题总结
- 嵌入式开发-C语言面试题
- 16道嵌入式C语言笔试面试题(经典!)
- 嵌入式面试题——有意思的C语言题
- 嵌入式开发工程师面试题 – C语言部分
- [zt] 嵌入式工程师经典面试题
- dsp,嵌入式面试题
- 高质量的C/C++编程【某市第九研究所嵌入式软件开发工程师面试题】
- 16道嵌入式C语言面试题(经典)