嵌入式软件工程师笔试题-1(含答案讲解)

简介: 预编译又可以叫做预处理,是进行一些代码文本的替代工作

1.什么是预编译?什么时候需要预编译?

 答:预编译又可以叫做预处理,是进行一些代码文本的替代工作;

什么时候需要预编译:

  1. 不经常需要改动的大型代码;
  2. 程序有多个模块组成,所有的代码都使用同一组标准的函头文件和相同编译选项

2.char *const p和char const *p 以及const char *p三个区别

 char *const p,是指针常量,p的值不可以被改变;

 char const *p,指的是指向常量的指针,指向的指针不可以改;

 const char *p等同于const char *p;

3.以下程序的输出结果

char str1[] = "abc";
char str2[] = "abc";
const char str3[] = "abc"; 
const char str4[] = "abc"; 
const char *str5 = "abc";
const char *str6 = "abc";
char *str7 = "abc"; 
char *str8 = "abc"; 
cout < < ( str1 == str2 ) < < endl; 
cout < < ( str3 == str4 ) < < endl;
cout < < ( str5 == str6 ) < < endl; 
cout < < ( str7 == str8 ) < < endl;

答:0 0 1 1,因为str1,str2,str3,str4 是数组变量,它们有各自的内存空间;而 str5,str6,str7,str8 是指针,它们指向相同的常量区域。

4. 以下代码中的sizeof用法有什么问题?

void UpperCase( char str[] ) // 将 str 中的小写字母转换成大写字母 
{ for( size_t i=0; i <sizeof(str)/sizeof(str[0]); ++i )
  if( 'a' <=str[i] && str[i] <='z' ) 
   str[i] -= ('a'-'A' ); }
char str[] = "aBcDe";
 cout < < "str 字符长度为: " < < sizeof(str)/sizeof(str[0]) < < endl; UpperCase( str ); 
cout < < str < < endl;

答案:函数内的 sizeof 有问题。根据语法,sizeof 如用于数组,只能测出静态数组的大小,无法检测动态分配的或外部数组大小。函数外的 str 是一个静态定义的数组,因此其大小为 6,因为还有'\0',函数内的 str 实际只是一个指向字符串的指针,没有任何额外的与数组相关的信息,因此 sizeof 作用于上只将其当指针看,一个指针为4 个字节,因此返回 4。

5.一个32位的机器,这个机器的指针是几位?

答:要看指针是几位,就要看地址总线的位数就好了。80386以后的机子都是32的数据总线,所以指针的位数是4个字节!

6.代码输出结果

#include<stdio.h>
int main()
{
    int a[5]={1,2,3,4,5};
    int *ptr=(int *)(&a+1);
    printf("%d %d ",*(a+1),*(ptr-1));
  return 0;
}

答案:2   5

因为我们的*(a+1) 就是a[1],*(ptr-1)就是a[4],所以结果就是2,5.  因为我们&a+1不是首地址+1,系统会认为加一个a数组的偏移,就是偏移另一个数组的大小 int*ptr=(int *)(&a+1);则ptr实际上就是&(a[5]),也就是a+5 原因:因为&a是数组指针,类型是int(*)[5];而指针加上1要根据指针类型加上一定的值,不同的类型指针+1之后增加的大小不同a是长度为5的int数组指针,所以要加上我们的5*sizeof(int),所以ptr实际就是a[5],但是ptr和(&a+1)类型是不一样的(这一点很重要),所以ptr-1只会减去size(int*)。

7.下面代码出错在哪里?

#include<stdio.h>
int main()
{
    char a;
    char *str=&a;
    strcpy(str,"hello");
    printf(str);
    return 0;
}

答:没有给str分配内存空间,将会产生异常,问题出在讲一个字符串复制进到一个字符变量指针所指向的指针。虽然可以正确输出结果,但是越界进行内存读写会导致程序崩溃!

8.下面代码出错在哪里?

#include<stdio.h>
int main()
{
   char *s="AAA";
   printf("%s",s);
   s[0]='B'
   printf("%s",s);
    return 0;
}

答:“AAA”是我们的字符串常量,s是指针,指向这个字符串常量,所以声明s的时候就有问题。const char *s ="AAA";然后又因为是常量,所以对是s[0]的赋值操作是不合法的;

9.写一个标准的宏,这个宏输入两个参数并返回较小的哪一个。

答:#define MIN(X,Y)((X)>(Y)?(Y):(X))    //注意,结尾这里没有“;”

10.嵌入式系统经常要用单无羡循环,你怎么用c编写死循环?

答:使用while(1){}或者for(;;)

11.关键字static的作用是什么?

答:定义静态变量    或者  定义静态函数

12.关键字const有什么含义?

答:定义常量不可以修改的变量

13.关键字volatile有什么含义?并列出三个例子

答:含义:用于提示编码器对象可能在编码器没有监测到情况下改变;

  1. 并行设备的应缴寄存器(状态寄存器);
  2. 中断函数中会访问到的非自动变量;
  3. 多线程应用当中呗几个任务共享的变量; 

14.int(*s[10](int)) 表示什么意思?

答:int类型指针数组求整,是一个函数指针数组,每一个指针指向一个int func(int param)的函数;

15.看下列程序回答问题

int a=248,b=4;
int const c=21;
const int*d=&a;
int *const e=&b;
int const *f const=&a;
//请问下列表达式哪一些会被编码器禁止?为什么?

答:*c=32; d=&b; *d=43; e=34; e=&a; f=0x321f; *c 这是个什么东东,禁止 *d 说了是 const, 禁止 e

= &a 说了是 const 禁止 const *f const =&a; 禁止

16.交换两个变量的值,不适用第三个变量。即a=3,b=5,交换之后a=5,b=3;

答:有两个解法,一个是使用算数运算,另一个就是使用异或,算术运算:a=a+b;b=a-b;a=a-b; 异或:a=a^b;

17.C和C++ 中的struct有什么不同?

答:主要区别是C当中的struct不可以函数成员函数,但是C++中对的可以。C++中的struct和class的主要区别在于默认的存取权限不一样,struct默认为public,但是class默认为private。

18.以下代码会出现什么结果?

#include <stdio.h>
#include <stdlib.h> 
void getmemory(char *p) 
{
  p=(char *) malloc(100); 
  strcpy(p,"hello world"); 
  }
  int main() 
  { 
  char *str=NULL;
   getmemory(str); 
 printf("%s/n",str); 
 free(str); 
 return 0; 
 }

答:程序会爆炸,因为getmemory中的malloc不可以返回动态内存,free()对str操作很危险。

19.以下代码会出现什么结果?

char szstr[10];
strcpy(szstr,"0123456789");

答:产生的结果是:长度不一样,会造成我们非法的OS

20. 列举几种进程的同步机制,并比较其优缺点

答:原子操作   信号量机制    自旋锁  管程 ,会合 ,分布式系统

21.进程之间的通信途径

答:共享存储系统信息传递系统管道;一文件系统为基础

22.进程死锁的原因

答:资源竞争以及进程推进顺序非法

23.死锁的4个必要条件

互斥、请求保持、不可剥夺、环路

24.死锁处理

鸵鸟策略、预防策略、避免策略、检测与解除死锁

25.操作系统当中进程调度策略有哪几种?

FCTS、优先级、时间片轮转、多级反馈

26.类的静态成员和非静态成员的区别

类的静态成员每个类只有一个,非静态成员每个对象一个

27.纯虚函数该怎么定义?使用的时候要注意什么?

virtual void f()=0;注意接口,之类必须要实现

28.数组和链表区别

答:数组存数据按照顺序存储,固定大小;

链表存数据随机,大小可以动态改变

29.JSO的七层模型是什么? TCP/UDP属于哪一层?TCP/udp有什么优缺点?

答:应用层、表示层、会话层、传输层、网络层、链路层、物理层;

tcp属于传输层;TCP 服务提供了数据流传输、可靠性、有效流控制、全双工操作和多路复用技术等。与 TCP 不同, UDP 并不提供对 IP 协议的可靠机制、流控制以及错误恢复功能等。由于 UDP 比较简单,UDP 头包含很少的字节,比 TCP

负载消耗少。 tcp: 提供稳定的传输服务,有流量控制,缺点是包头大,冗余性不好 udp: 不提供稳定的服务, 包头小,开销小

30.根据代码回答问题

int main()
{
   int x=3;
   printf("%d",x);
return 1;
}

问题:函数既然不会被其他函数调用,为什么会返回1?

答:因为在main当中,C语言的标准是认为0代表成功,非0代表错误,具体的值是某中具体出错信息。

31.(void*)ptr和(*(void**))ptr的结果是不是相同?其中ptr为同一个指针

答:两个结果是相同的;

32.已知一个数组table,用一个宏定义,求这个数据的元素个数

答:#define NTBL(table) (sizeof(table)/sizeof(table)[0])

相关文章
|
存储 网络协议 Linux
360嵌入式软开面经,纯八股文~
360嵌入式软开面经,纯八股文~
360嵌入式软开面经,纯八股文~
|
网络协议 Linux Android开发
年前Get一个知识点|想学嵌入式开发,要学的具体有什么?​
年前Get一个知识点|想学嵌入式开发,要学的具体有什么?​
|
存储 网络协议 Linux
嵌入式技术知识体系问答(找工作笔试面试可能有用)
嵌入式技术知识体系问答(找工作笔试面试可能有用)
166 0
|
6月前
|
安全 算法 开发工具
【C 言专栏】基于 C 语言的嵌入式系统开发
【5月更文挑战第1天】本文探讨了C语言在嵌入式系统开发中的核心作用。嵌入式系统作为专用计算机系统广泛应用于家电、汽车、医疗等领域,具备实时性、低功耗等特点。C语言因其高效性、可移植性和灵活性成为开发首选。文章介绍了开发流程,包括需求分析、硬件选型、软件设计至部署维护,并强调中断处理、内存管理等关键技术。C语言在智能家居、汽车电子和医疗设备等领域的应用实例展示了其广泛影响力。面对硬件限制、实时性要求和安全挑战,开发者需不断优化和适应新技术趋势,以推动嵌入式系统创新发展。
142 0
【C 言专栏】基于 C 语言的嵌入式系统开发
|
6月前
|
运维 物联网 Linux
嵌入式面试求职分享(经典)
嵌入式面试求职分享(经典)
172 0
|
6月前
|
存储 C语言
嵌入式面试刷题(day3)
嵌入式面试刷题(day3)
69 0
|
6月前
|
网络协议 安全 编译器
嵌入式笔试面试刷题(day11)
嵌入式笔试面试刷题(day11)
70 0
|
6月前
|
编译器 调度
嵌入式面试笔试刷题(day4)
嵌入式面试笔试刷题(day4)
73 0
|
6月前
|
存储 消息中间件 编译器
嵌入式面试笔试刷题(day6)
嵌入式面试笔试刷题(day6)
75 0