大华嵌入式笔试总结-提前批+正式批(已offer)

百度
紫光
大疆
爱奇艺
科大讯飞
cvte
蔚来
大华
乐鑫
联发科

相关文章:
大华(华橙网络)嵌入式面试总结-正式批(已offer)
大华(华飞智能)嵌入式面试总结-提前批

大华有很多子公司,我当时还以为投递的大华总部,后来才发现是其子公司,其中就包括华飞智能和华橙网络。

本文由小b努力梳理,内容确实蛮多的,但是大华的笔试题就是这么实打实的还是挺不错的,所以也希望大家能耐心的看看,最后希望大家秋招收获满意offer!

注:以下内容为本人认为较难的题目及其涉及到的相关知识点

华飞智能-提前批

37道题(60min)
(1)struct A{
char t:4;
char k:4;
unsigned short i:8;
unsigned long m;
}
求sizeof(A) 答案:8
考查C语言相关位域知识点,阅读文章:
https://blog.csdn.net/zhengnianli/article/details/87386078

有些数据在存储时并不需要占用一个完整的字节,只需要占用一个或几个二进制位即可。例如开关只有通电和断电两种状态,用0和1表示足以,也就是用一个二进位。正是基于这种考虑,C语言又提供了一种数据结构,叫做“位域”或“位段”,位域是操控位的一种方法。
位域的宽度不能超过它所依附的数据类型的长度。通俗地讲,成员变量都是有类型的,这个类型限制了成员变量的最大长度,:后面的数字不能超过这个长度。
位域也需要按内存对齐到需对齐数据类型的字节,以便提高存取效率。

(2)#define sum(a,b) a+b
printf(“%d\n”,sum(sum(2,5),sum(4,10)*sum(2,3));
求输出结果 34
考查C语言宏定义用法

(3)map<key,value>不是基本数据类型,则需要哪个实现函数(与operator相关)

(4)int a =320;
char p = (char)&a;
print(“%d\n”,*p);
求输出 答案:64 (320-256)

(5)程序执行代码放在哪个内存段中
(text)代码段:又称为文本段。存储可执行文件的指令;也有可能包含一些只读的常数变量,例如字符串常量等。

(6)析构函数中哪些动作不能执行
不能析构函数中抛出异常
从语法上面讲,析构函数抛出异常是可以的,C++并没有禁止析构函数引发异常,但是C++不推荐这一做法,从析构函数中抛出异常是及其危险的。
析构函数可能在对象正常结束生命周期时调用,也可能在有异常发生时从函数堆栈清理时调用。前一种情况抛出异常不会有无法预料的结果,可以正常捕获;但后一种情况下,因为函数发生了异常而导致函数的局部变量的析构函数被调用,析构函数又抛出异常,本来局部对象抛出的异常应该是由它所在的函数负责捕获的,现在函数既然已经发生了异常,必定不能捕获,因此,异常处理机制只能调用terminate()。若真的不得不从析构函数抛出异常,应该首先检查当前是否有仍未处理的异常,若没有,才可以正常抛出。

(7)哪种线程通信方式,尽量不要用锁
暂时确定共享内存需要锁

(8)面向对象程序设计的三个基本特征
封装,继承,多态,(抽象)

(9)32位输出sizeof(0xAABBCCDD)大小为 4,在C语言中整数默认是int型

(10)不用C/C++字符串库函数,编写函数strcpy()

char *strcpy(char *strDest,const char *strSrc)//源字符串参数用const修饰,防止修改源字符串
{
if(!strDest||!strSrc)//空指针检查
return NULL;
char *ad=strDest;//返回目标地址
while((*strDest++=*strSrc++)!=’\0’); //’\0’
return ad;
}

(11)C++的noexpect关键字含义

编译器在编译时能过做的检测非常有限,因此在C++11中异常声明被简化为以下两种情况:
(1)函数可以抛出任何异常;
(2)函数不可以抛出任何异常。
在C++11中,声明一个函数不可以抛出任何异常使用关键字noexcept.

(12)a是unsigned int类型,a%1024 == a & (1024-1)

(13)理解long long p = (long long)((long long)a);

(14)求 struct B{
char b[0];
short a;
}的大小

答案:2,char b[0]不占用内存空间

(15)C++通用迭代器遍历是哪个方法(举例:iter=erase(iter++))
顺序容器,如vector,deque
while()
{
iter = a.erase(iter);
}
else
{
iter++;
}

关联性容器,如map,set,list
用上面和下面方法皆可
while()
{
iter = a.erase(iter++);
}
else
{
iter++;
}

(16)C++lamda表达式是否可以如下使用
void (int a = [](return x+1;)())(cout<<a<<endl;)

华橙网络

(1)求输出

void f(int a=[])()
{
static int b = 1;
return b++;
}(){
std:cout<<a;
}
int main()
{
f();
f();
}

(2)C++所有容器中,通用的遍历删除方法是
iter = Vec.erase( iter);

(3)shared_ptr和weak_ptr的区别和联系

(4)char &rc = *pc 怎么写是否违法?不违法
测试代码

#include "stdafx.h"
#include <Windows.h>
#include<iostream>
using namespace std;

int main()
{
	int a = 100, *pc;
	pc = &a;
	int &test = *pc;
	cout << "test:" << test << endl;
	system("pause");
	return 0;
}

(5)求输出

#include<iostream>
struct X{
X(){std:cout<<1;}
X(const X&){std:cout<<3;}
~X(){std:cout<<2;}
void f(){std:cout<<4;}
}  object;
int main()
{
X(object);
object.f();  
}

输出11422
测试用例

#include "stdafx.h"
#include <Windows.h>
#include<iostream>
using namespace std;
class X {
public:
	X() { std:cout << "1"; }
	X(const X&) { std:cout << "3"; }
	~X() { std:cout << "2"; }
	void f() { std:cout << "4"; }
}  object;

int main()
{
	X(object); //声明了一个局部变量object,该变量与全局变量不同,
			   //所以会调用默认构造函数
			   //此情况与复制构造函数不同,复制构造函数需要生成一个新的类对象
	object.f();
	system("pause");
	return 0;
}

(6)unsigned short 变量最大值 65536
#include "stdafx.h"
#include <Windows.h>
#include<iostream>
using namespace std;

int main()
{
	unsigned short a = 0;
	unsigned int tmp=0;
	while (++a>tmp)
	{
		tmp = a;
	}
	cout << "Max unsigned short = :" << tmp << endl;
	system("pause");
	return 0;
}

(7)char b[0]的大小

(8)函数定义可以嵌套写吗 函数可以嵌套调用,不可以嵌套定义

(9)C语言常用的运行速度优化算法

(10)求输出

class A
{
public:
A()
{
printf(“A construct \n”);
func_init();
}
virtual ~A()
{
printf(“A Destruct \n”);
func_deinit();
}
virtual void func_init()
{
printf(this is A func_init\n”);
}
virtual void func_deinit()
{
printf(this is A func_deinit\n”);
}
}
int  main()
{
A *p = new B();
delete p;
}

#include "stdafx.h"
#include <Windows.h>
#include<iostream>
using namespace std;

class A
{
public:
	A()
	{
		printf("A construct \n");
		func_init();
	}
	virtual ~A()
	{
		printf("A Destruct \n");
		func_deinit();
	}
	virtual void func_init()
	{
		printf("this is A func_init\n");
	}
	virtual void func_deinit()
	{
		printf("this is A func_deinit\n");
	}
};

class B:public A
{
public:
	B()
	{
		printf("B construct \n");
		func_init();
	}
	virtual ~B()
	{
		printf("B Destruct \n");
		func_deinit();
	}
	virtual void func_init()
	{
		printf("this is B func_init\n");
	}
	virtual void func_deinit()
	{
		printf("this is B func_deinit\n");
	}
};

int  main()
{
	A *p = new B();
	//B *p = new B();
	delete p;
	system("pause");
	return 0;
}

(11)switch()使用continue效果
在switch中使用的只有break,continue只能配合循环使用

(12)malloc如何申请整形数组内存

(13)一个线程可以创建另一个线程?

(14)非对称加密应用范畴

  1. 信息加密
      收信者是唯一能够解开加密信息的人,因此收信者手里的必须是私钥。发信者手里的是公钥,其它人知道公钥没有关系,因为其它人发来的信息对收信者没有意义。
  2. 登录认证
    客户端需要将认证标识传送给服务器,此认证标识(可能是一个随机数)其它客户端可以知道,因此需要用私钥加密,客户端保存的是私钥。服务器端保存的是公钥,其它服务器知道公钥没有关系,因为客户端不需要登录其它服务器。
  3. 数字签名
      数字签名是为了表明信息没有受到伪造,确实是信息拥有者发出来的,附在信息原文的后面。就像手写的签名一样,具有不可抵赖性和简洁性。
      简洁性:对信息原文做hash,得到digest。信息越短加密的耗时越少。
      不可抵赖性:信息拥有者要保证签名的唯一性,必须是唯一能够加密digest的人,因此必须用私钥加密(就像字迹他人无法学会一样),得到签名。如果用公钥,那每个人都可以伪造签名了。
    4.数字证书
      问题起源:对1和3,发信者怎么知道从网上获取的公钥就是真的?没有遭受中间人攻击?
      这样就需要第三方机构来保证公钥的合法性,这个第三方机构就是CA(Certificate Authority),证书中心。
      CA用自己的私钥对信息原文所有者发布的公钥和相关信息进行加密,得出的内容就是数字证书。
      信息原文的所有者以后发布信息时,除了带上自己的签名,还带上数字证书,就可以保证信息不被篡改了。信息的接收者先用CA给的公钥解出信息所有者的公钥,这样可以保证信息所有者的公钥是真正的公钥,然后就能通过该公钥证明数字签名是否真实了。

(15)菱形继承需要加什么关键字能防止资源浪费 virtual

(16)noexpect的作用
确认某个函数不会抛出异常;我们根本不知道该如何处理异常
通过C++11模板编程实现一个功能,判断模板参数是否为智能指针

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值