欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 明星 > 嵌入式笔试题+面试题

嵌入式笔试题+面试题

2025/6/6 18:56:47 来源:https://blog.csdn.net/xiaolangyangyang/article/details/148408127  浏览:    关键词:嵌入式笔试题+面试题

一、嵌入式笔试题

1) int a;
2) int *a;
3) int **a;
4) int a[10];
5) int *a[10];
6) int (*a)[10];
7) int (*a)(int);
8) int (*a[10])(int);
(1) 一个整型数
(2) 一个指向整型数的指针
(3) 一个指向指针的的指针,它指向的指针是指向一个整型数
(4) 一个有10个整型数的数组
(5) 一个有10个指针的数组,该指针是指向一个整型数
(6) 一个指向有10个整型数数组的指针
(7) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数
(8) 一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数

int (*a)[]
int (**a)[]
int **a[10]
(1) 以上各行代码在作为函数形参时分别是什么意思?
(2) 以上各行代码出现在变量定义时分别是什么意思?

数组指针:int (*a)[10];
指针数组:int *a[10];
函数指针:int (*a)(int);
指针函数:int *a(int);

int f(int *a[10]);
int f(int *a[]);
int f(int **a);
这三行东西有什么区别吗?

数组 / 指针 / 数组指针 / 指针数组

关键字
Static、Const、Volatile
Const和Volatile同时修饰一个参数

const int a;
int const a;
const int * a; // a是一个指向常整型数的指针
int * const a; // a是一个指向整型数的常指针
int const * a const;

相关连接

c/c++笔试题整理
经典16道:嵌入式C语言笔试题
从一道C语言数组指针的笔试题看面试者的能力和心态

内存管理

深入理解Linux内存管理--目录导航
探索 Linux 内存模型
Linux 驱动面试题总结

笔试代码

// 01.c#include <stdio.h>
#include <stdlib.h>
#include <string.h>#define Max(x,y)  ((x) > (y) ? (x) : (y))
#define Min(x,y)  ((x) < (y) ? (x) : (y))int str_to_matrix(char * s, char * d, int * line, int * row)
{unsigned int i = 0;unsigned int mlen = 0;if(s==NULL || d==NULL || line==NULL || row==NULL)return -1;*line = 0;*row = 0;while(s[i] != '\0'){if(s[i] == '0' || s[i] == '1'){d[mlen] = s[i];mlen++;}if(s[i] == '\n'){*line = *line + 1;}i++;}*line = *line - 1;*row = mlen/(*line);
}int main(void)
{int m, n, i, j;char d[1000];int res = 0;int height[1000];int left[1000];int right[1000];memset(d, 0x00, sizeof(d));memset(height, 0x00, sizeof(height));memset(left, 0x00, sizeof(left));memset(right, 0x00, sizeof(right));str_to_matrix(\
"[\n\
['1','0','1','0','0'],\n\
['1','0','1','1','1'],\n\
['1','1','1','1','1'],\n\
['1','0','0','1','0']\n\
]", d, &m, &n);for(i=0; i<m*n; ++i){int cur_left = 0;int cur_right = n;for(j=0; j<n; ++j){if(d[i*n+j] == '1'){++height[j];left[j] = Max(left[j], cur_left);}else{height[j] = 0;left[j] = 0;cur_left = j + 1;}}for(j=n-1; j>=0; --j){if(d[i*n+j] == '1'){right[j] = Min(right[j], cur_right);}else{right[j] = n;cur_right = j;}res = Max(res, (right[j] - left[j]) * height[j]);}}printf("%d\n", res);return res;
}
// 02.c#include <stdio.h>
#include <stdlib.h>#define Max(x,y)  ((x) > (y) ? (x) : (y))int test(const char * s)
{unsigned int len = 0;int i, j, rst;if(s == NULL)return 0;while(s[len] != '\0'){len++;}if(len == 1)return 1;if(len == 2)return s[0]==s[1] ? 2 : 1;char * p = (char *)malloc(len * len);if(p == NULL){return -1;}for(i=0; i<len; i++){p[i*len+i] = 1;for(j=i-1; j>-1; j--){if(s[j] == s[i]){p[i*len+j] = 2 + p[(i-1)*len+j+1];}else{p[i*len+j] = Max(p[(i-1)*len+j], p[i*len+j+1]);}}}rst = p[(len-1)*len];if(p)free(p);return rst;
}int main(void)
{printf("%d\n", test("cbbd"));return 0;
}
// 03.c#include <stdio.h>
#include <stdlib.h>#define Max(x,y)  ((x) > (y) ? (x) : (y))int test(const char * s)
{unsigned int len = 0;int i, j, rst;if(s == NULL)return 0;while(s[len] != '\0'){len++;}if(len == 1)return 1;if(len == 2)return s[0]==s[1] ? 2 : 1;char * p = (char *)malloc(len * len);if(p == NULL){return -1;}for(i=0; i<len; i++){p[i*len+i] = 1;for(j=i-1; j>=0; j--){if(s[j] == s[i]){p[i*len+j] = 2 + p[(i-1)*len+j+1];}else{p[i*len+j] = Max(p[(i-1)*len+j], p[(i*len)+j+1]);}}}rst = p[(len-1)*len];if(p)free(p);return rst;
}int main(void)
{printf("%d\n", test("cbbd"));return 0;
}
// 04.c#include <stdio.h>
#include <stdlib.h>
#include <string.h>#define Max(x,y)  ((x) > (y) ? (x) : (y))
#define Min(x,y)  ((x) < (y) ? (x) : (y))int str_to_matrix(const char * s, char * d, int * line, int * row)
{unsigned int i = 0, mlen = 0;if(s==NULL || d==NULL || line==NULL || row==NULL)return -1;*line = 0;*row = 0;while(s[i] != '\0'){if(s[i] == '0' || s[i] == '1'){d[mlen] = s[i];mlen++;}if(s[i] == '\n'){*line = *line + 1;}i++;}*line = *line - 1;*row = mlen/(*line);return 0;
}int test(const char * input)
{int m, n, i, j, c_l, c_r;char d[1000];int h[100], l[100], r[100];int res = 0;memset(d, 0x00, sizeof(d));str_to_matrix(input, d, &m, &n);memset(h, 0x00, sizeof(h));memset(l, 0x00, sizeof(l));memset(r, n, sizeof(r));for(i=0; i<m*n; ++i){c_l = 0;c_r = n;for(j=0; j<n; ++j){if(d[i*n+j] == '1'){++h[j];l[j] = Max(l[j], c_l);}else{h[j] = 0;l[j] = 0;c_l = j + 1;}}for(j=n-1; j>=0; --j){if(d[i*n+j] == '1'){r[j] = Min(r[j], c_r);}else{r[j] = n;c_r = j;}res = Max(res, (r[j] - l[j]) * h[j]);}}return res;
}int main(void)
{char input[] = "[\n\
['1','0','1','0','0'],\n\
['1','0','1','1','1'],\n\
['1','1','1','1','1'],\n\
['1','0','0','1','0']\n\
]";printf("%d\n", test(input));return 0;
}

 华为笔试题 

转换-LeetCode85-最大矩形 
leetcode85. 最大矩形
LeetCode(85):最大矩形
LeetCode-最长回文子序列
516. 最长回文子序列

// 01.c#include <stdio.h>
#include <stdlib.h>
#include <string.h>#define Max(x,y)  ((x) > (y) ? (x) : (y))
#define Min(x,y)  ((x) < (y) ? (x) : (y))int str_to_matrix(char * s, char * d, int * line, int * row)
{unsigned int i = 0;unsigned int mlen = 0;if(s==NULL || d==NULL || line==NULL || row==NULL)return -1;*line = 0;*row = 0;while(s[i] != '\0'){if(s[i] == '0' || s[i] == '1'){d[mlen] = s[i];mlen++;}if(s[i] == '\n'){*line = *line + 1;}i++;}*line = *line - 1;*row = mlen/(*line);
}int main(void)
{int m, n, i, j;char d[1000];int res = 0;int height[1000];int left[1000];int right[1000];memset(d, 0x00, sizeof(d));memset(height, 0x00, sizeof(height));memset(left, 0x00, sizeof(left));memset(right, 0x00, sizeof(right));str_to_matrix(\
"[\n\
['1','0','1','0','0'],\n\
['1','0','1','1','1'],\n\
['1','1','1','1','1'],\n\
['1','0','0','1','0']\n\
]", d, &m, &n);for(i=0; i<m*n; ++i){int cur_left = 0;int cur_right = n;for(j=0; j<n; ++j){if(d[i*n+j] == '1'){++height[j];left[j] = Max(left[j], cur_left);}else{height[j] = 0;left[j] = 0;cur_left = j + 1;}}for(j=n-1; j>=0; --j){if(d[i*n+j] == '1'){right[j] = Min(right[j], cur_right);}else{right[j] = n;cur_right = j;}res = Max(res, (right[j] - left[j]) * height[j]);}}printf("%d\n", res);return res;
}
// 02.c#include <stdio.h>
#include <stdlib.h>#define Max(x,y)  ((x) > (y) ? (x) : (y))int test(const char * s)
{unsigned int len = 0;int i, j, rst;if(s == NULL)return 0;while(s[len] != '\0'){len++;}if(len == 1)return 1;if(len == 2)return s[0]==s[1] ? 2 : 1;char * p = (char *)malloc(len * len);if(p == NULL){return -1;}for(i=0; i<len; i++){p[i*len+i] = 1;for(j=i-1; j>-1; j--){if(s[j] == s[i]){p[i*len+j] = 2 + p[(i-1)*len+j+1];}else{p[i*len+j] = Max(p[(i-1)*len+j], p[i*len+j+1]);}}}rst = p[(len-1)*len];if(p)free(p);return rst;
}int main(void)
{printf("%d\n", test("cbbd"));return 0;
}

笔试题1——找出最长/最短子串:
1、给定一个字符串s,找出不重复的最长子串,需要保存子串和长度,只能用C语言;
2、给出一个数组和一个目标值,要求找出大于或等于目标值的最短子数组;
PS:有时候面试官要求规定的方法来写:用两个下标,一次遍历整个数组。

笔试题2——合并两个有序数列:
1、2个链表,去重然后排列成一个;
2、合并两个有序数组并移除相同数字;
3、合并两个长度不定有序数组并移除相同数字,不能用排序算法实现;
4、实现两个有序数组的合并,数组内有有序且重复的元素。
5、合并两个长度不定的有序数组并移除相同的数字,返回首地址和长度。(合并、排序、除同在一个循环中实现)

// code05.c#include <stdio.h>
#include <stdlib.h>
#include <string.h>// 合并两个长度不定的有序数组并移除相同的数字,返回首地址和长度。(合并、排序、除同在一个循环中实现)
void merge(int *nums1, int m, int *nums2, int n, int *out, int *out_len)
{int i1 = 0;int i2 = 0;int i = 0;int ii = 0;int *tmp = (int *)malloc(sizeof(int) * (m + n));if (nums1[i1] > nums2[i2]) {tmp[ii++] = nums2[i2++];} else {tmp[ii++] = nums1[i1++];}for (i = 1; i < m + n; i++) {if (i1 >= m) {if (nums2[i2] > tmp[ii - 1]) {tmp[ii++] = nums2[i2++];} else {i2++;}continue;}if (i2 >= n) {if (nums1[i1] > tmp[ii - 1]) {tmp[ii++] = nums1[i1++];} else {i1++;}continue;}if (nums1[i1] > nums2[i2]) {if (nums2[i2] > tmp[ii - 1]) {tmp[ii++] = nums2[i2++];} else {i2++;}} else if (nums1[i1] < nums2[i2]) {if (nums1[i1] > tmp[ii - 1]) {tmp[ii++] = nums1[i1++];} else {i1++;}} else {tmp[ii++] = nums1[i1++];}}*out_len = ii;memcpy(out, tmp, sizeof(int) * ii);free(tmp);tmp = NULL;
}void main(void)
{int a[5] = {1, 2, 2, 3, 4};int b[5] = {1, 3, 3, 4, 5};int out[10];int out_len;int i;merge(a, 5, b, 5, out, &out_len);for (i = 0; i < out_len; i++) {printf("%d\n", out[i]);}
}

笔试题3——其他:

1、其他题的话,C会出内存相关、线程相关的;

二、嵌入式面试题

1、怎么固定一个函数的地址;
2、堆和栈上的内存越界会发生什么;
3、动态库相关(原理、链接);
4、elf相关;
5、const的常量放在什么位置;
6、汇编相关;
7、科学运算库;
8、“stl”function;
9、浅拷贝和引用的区别;
10、函数调用是怎么调用的;
11、怎么调试代码;
12、怎么打断点;
13、线程间通信方式;

14、内存中堆和栈的区别;
15、C++有哪些智能指针,其中的区别是什么;
16、队列:向一个队列放进去几K的数据,这时候如何处理。
17、原子操作
18、信号量和互斥锁
19、__attribute__
20、一个父函数里面有一个子函数,这个子函数里面定义一个1K的数组,然后会发生什么,父函数能得到这个数组数据吗?以及如何调试?
21、函数调用
22、volatile
23、静态链接库和动态链接库
24、两个核CPU,每个核同时处理同样的代码,会有什么问题?
25、介绍堆和栈以及区别
26、栈里面的数据如何存取
27、栈里面都放那些数据
28、代码段、BSS段以及他们里面都放那些数据
29、cache(详细到L1L2L3)
30、宏定义和内联函数的区别
31、变量初始化在哪个步骤完成
32、ARM核
33、linux的RTOS?

34、线程死锁的原因及如何避免
35、QT的信号和槽底层原理
36、FreeRTOS什么情况下会发生线程优先级翻转

37、tickless时,怎么计时
38、FreeRTOS移植步骤
39、怎么提高cache命中率
40、arm中断,linux中断

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词