景嘉微在线测评(笔试)+ 线下一二三面
邮件写的是在线测评,实际就是笔试,投的AI算法,来的全是C的题,非常基础,1个小时,42个题,17个单选,6个多选,4个填空,12个判断,3个编程;
1、linux的memory section包括:代码段、数据段BSS、堆heap、栈stack、环境变量和参数字符串、映射文件;
2、linux可执行文件格式:COFF;EXE、MSI都是Windows下的;GO是GO编译器下的;
3、C语言是静态语言;
4、int a[3][4]的非法引用是:a[0][4];
5、静态变量在函数外部和全局变量生命周期相同,在函数内部,初始化一次调用一次;
6、函数int func(int i,int j);函数指针int(*P)(int i,int j);那么P的赋值语句是P=func;
7、"ffff"是字符串,每个字符1个字节+末尾‘/0’1个字节;(unsigned int)0xffffffff占4个字节;(int)0xffffffff占4个字节;(char)0xffffffff占1个字节;
8、指向数组的指针将指向数组的首地址;通过++操作可以向后平移;
9、初始化二维数组时可以不写行数,但不能不写列数;规定了行数和列数就必须全部填充值,不能缺失;
10、略;
11、在C语言中,函数的参数传递方式主要有两种:值传递和指针传递
12、略;
13、联合体union的大小由最大内存占用成员决定;32位中int和float占4字节,double占8字节;struct则是将所包含的内容字节数相加;
14、VxWorkersOS是美国的嵌入式操作系统;ACoreOS天脉和ReworksOS和SylixOS翼辉是国产操作系统;
15、3A*124=446C是14进制;
16、char str1[6]="abcdm";*str2="abcdef";那么strcmp(str1,str2)将逐个位置对比,因为m>e,所以返回大于0;strlen(str1)=5;strcpy(str1,str2)是错误的;
17、要对绝对地址0x100000赋值,可以用*(unsigned int*)0x100000=1234;那么要是想让程序跳转到0x100000去执行(无参数、无返回值)应该使用((void(*)())0x100000)();
18、c语言的合法整数:0Xffa、0386、10110;x2a2不是;
19、指针初始化为内存地址int *ptr = (int *)0x12345678;int *ptr[3]指针数组,数组内是指针;char *ptr就是字符串数组;
20、以太网利用ARP协议获得目的主机MAC地址和IP地址的映射关系;
21、一维数组初始化可以不用填充满,会自动补0,二维数组就不行了;
22、对于一个互斥信号量来说,常用的操作接口有创建、释放、等待;
23、嵌入式操作系统中,任务之间的通信方式有信号量、共享内存;
24、局部变量在栈区、全局变量在静态存储区、动态申请在堆区;
25、int b[90];则sizeof(b)是360;
26、int (*func)(int)表示一个指向函数的指针,该函数有一个整型参数并返回一个整型;
27、10人20h可以挖5m,那么10h挖20m需要80人;
28、int指针a,++后地址应该是+4字节;
29、const char *a="hello";那么sizeof(a)并不是表示字符串数组的内存占用5+1=6个字节,而是指针的内存占用,32位是4个字节,64位是8个字节;
30、在C语言中,i++ 是一个后缀递增运算符,它本身并不是一个完整的赋值语句;
31、取地址运算符&和指针运算符*优先级是不同的,取地址优先级更高,结合方向是自右向左;
32、dma传输数据需要考虑cache一致性问题;
33、在c语言中if(x==5)误写成了if(x=5)并不会编译错误;
34、float a;a=5;不会触发类型转换;
35、for循环中i++和++i是一样的;
36、中断服务器中可以使用printf,但需要谨慎;
37、浮点数的==判断可能不一定完全相同;
38、c语言中%10.4表示数据输出的最小宽度为10,小数位数为4;
39、cache的最小操作单位不是1字节,常见的有32、64、128字节;
40、编程:考察字符数组最后要用‘\0’结尾;
41、编程:c语言移动字符数组;
答案:
void LoopMove(char* pStr, int steps) {
if (pStr == NULL || steps <= 0) {
return;
}
int len = strlen(pStr);
if (len == 0) {
return;
}
steps = steps % len; // 若steps大于字符串长度,则取余数
if (steps == 0) {
return;
}
char temp[255]; // 假设字符串长度不会超过255
strncpy(temp, pStr + len - steps, steps); // 拷贝最后steps个字符到临时数组
memmove(pStr + steps, pStr, len - steps);// 将前面的字符向右移动
memcpy(pStr, temp, steps); // 将临时数组中的字符拷贝到字符串开头
}
42、编程:识别16进制数,并转为数据;
答案:
// 检查字符是否为16进制字符
int IsHexChar(char c) {
return (c >= '0' && c <= '9') ||
(c >= 'A' && c <= 'F') ||
(c >= 'a' && c <= 'f');
}
// 16进制字符串转换为数据
bool HexStringToData(const char* pStr, unsigned char* pData, size_t* pDataSize) {
if (pStr == NULL || pData == NULL || pDataSize == NULL) {
// 参数错误
return false;
}
int dataSize = 0;
// 检查字符串是否以 "0x" 或 "0X" 开头
if (pStr[0] == '0' && (pStr[1] == 'x' || pStr[1] == 'X')) {
// 跳过前缀 "0x" 或 "0X"
const char* pHex = pStr + 2;
// 逐个字符转换
while (*pHex) {
if (IsHexChar(*pHex)) {
int highDigit = -1;
if (*pHex >= '0' && *pHex <= '9') {
highDigit = *pHex - '0';
} else if (*pHex >= 'A' && *pHex <= 'F') {
highDigit = *pHex - 'A' + 10;
} else if (*pHex >= 'a' && *pHex <= 'f') {
highDigit = *pHex - 'a' + 10;
}
pHex++;
if (*pHex) {
int lowDigit = -1;
if (*pHex >= '0' && *pHex <= '9') {
lowDigit = *pHex - '0';
} else if (*pHex >= 'A' && *pHex <= 'F') {
lowDigit = *pHex - 'A' + 10;
} else if (*pHex >= 'a' && *pHex <= 'f') {
lowDigit = *pHex - 'a' + 10;
}
if (lowDigit != -1) {
// 将两个16进制数字组合成一个字节
pData[dataSize++] = (unsigned char)(highDigit * 16 + lowDigit);
pHex++;
} else {
// 无效字符
return false;
}
} else {
// 奇数个16进制字符
return false;
}
} else {
// 无效的16进制字符
return false;
}
}
} else {
// 不是以 "0x" 或 "0X" 开头
return false;
}
*pDataSize = dataSize;
return true;}
------------------------------更重要的来了,线下的一二三面-----------------------------------
一面:技术,2v1,我面的算法岗位分芯片和寄存两个分支,全程拷打项目,无手撕无八股,时间30分钟以内,也唠唠家常,面试官没有为难,偏底层的芯片面试官应该是没看上,偏算法的寄存这边评价稍微高点,全程面试官手写评价,从简历里面挑重点抄;
二面:项目部,2v1,同样是芯片和寄存,基本就是唠家常,问一下面对困难,薪资不满意、工作强度高等等可能的职场问题,没有技术问题,半小时以内;
三面:hr,1v1,再次询问情况,询问最低签约报价等等,反问了一下组织架构,芯片方面研发大约是200人,算法需求少,寄存方向研发大概是100多人,ai算法暂时没有独立成组,就是博士带队几个人,优先招博士。
---------------------------offer--------------------------------
offer比报价高,额外有安家费,5年拿满,要求2天回复是否签约,3天寄出三方,逼签比较严重,准备拒了。