嵌入式笔试题+面试题

发布于:2025-06-04 ⋅ 阅读:(29) ⋅ 点赞:(0)

一、嵌入式笔试题

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中断


网站公告

今日签到

点亮在社区的每一天
去签到