嵌入式笔试(第四天)

嵌入式笔试题汇总(前 10 题)

1. 某 32 位系统下,C 程序,请写出输出结果:

void Foo(char str[100]){
    printf("%d\n", sizeof(str));
}

int main(int argc, char **argv){
    char str[] = "http://localhost";
    char *p1 = str;
    void *p2 = malloc(100);
    int n = 10;

    struct A {
        int n;
        char str[10];
    } struct_a;

    printf("%d\n", sizeof(str));
    printf("%d\n", sizeof(p1));
    printf("%d\n", sizeof(p2));
    printf("%d\n", sizeof(n));
    printf("%d\n", sizeof(struct_a));

    Foo(str);
    return 0;
}

答案:

  • sizeof(str):18(字符串常量初始化,包含 \0
  • sizeof(p1):4(指针大小,32 位系统)
  • sizeof(p2):4(void 指针大小)
  • sizeof(n):4(int 类型)
  • sizeof(struct_a):16(结构体包含对齐)
  • Foo(str) 中的 sizeof(str):4(函数参数退化为指针)

2. 简述以下两段关于循环的程序的优缺点:

第一种写法:

for (i = 0; i < N; i++) {
    if (condition)
        DoSomething();
    else
        DoOtherthing();
}

第二种写法:

if (condition) {
    for (i = 0; i < N; i++)
        DoSomething();
} else {
    for (i = 0; i < N; i++)
        DoOtherthing();
}

答案:

  • 第一种写法逻辑简单、灵活,适合 condition 可能在运行时变化的情况,但循环中每次都判断一次 if,效率略低。
  • 第二种写法效率更高,避免了循环体内重复判断,但结构固定,适合条件不变的场景。

3. 运行下面的 Test 函数会有什么样的结果?

char *GetMemory(void) {
    char p[] = "hello world";
    return p;
}

void Test(void) {
    char *str = NULL;
    str = GetMemory();
    printf(str);
}

答案:

GetMemory 返回的是一个局部变量的地址,函数返回后内存失效,str 指向无效地址,会导致未定义行为,可能输出乱码或程序崩溃。

4. 用预处理指令 #define 声明一个常数,表示一年有多少秒(忽略闰年问题)。

#define SECONDS_IN_YEAR (365 * 24 * 60 * 60)

5. 请写出一个无限循环。

while (1) {
    // do something
}

for (;;) {
    // do something
}

6. 用变量 a 给出下面的定义:

  1. 一个整型数:
  2. 一个指向整型数的指针:
  3. 一个指向指针的指针,它指向的指针是指向一个整型数:
  4. 一个有 10 个整型数的数组:
  5. 一个指向函数的指针,它指向的函数参数是字符串,返回类型为整型:

7. C++ 中,分配在栈和堆中的分别是什么数据?

答案:

  • 栈(Stack):局部变量、函数参数
  • 堆(Heap):动态分配的内存(通过 newmalloc

8. 简述“内存对齐”问题:

答案:

内存对齐是指数据在内存中的地址必须是其类型大小的整数倍。其作用是提高 CPU 访问效率,避免跨字节或跨字节块访问导致的性能问题。内存对齐通过插入填充字节来实现。

9. 程序什么时候应该使用多线程,什么时候使用单线程?

答案:

  • 使用多线程:存在耗时操作(如 I/O、网络)需要响应多个任务并行处理多核 CPU 下可提升性能
  • 使用单线程:程序逻辑简单没有耗时阻塞操作对调试和同步要求高的场合

10. 编程题:传入一个 8 位无符号整数,生成其二进制反转字符串

示例:

输入:177(二进制为 10110001

输出:"10001101"

答案(C 实现):

char* reverseBits(unsigned char num) {
    static char result[9];
    for (int i = 0; i < 8; i++) {
        result[i] = ((num >> i) & 1) ? '1' : '0';
    }
    result[8] = '\0';
    return result;
}

嵌入式笔试专栏 文章被收录于专栏

本专栏系统整理了嵌入式方向笔试中常见的知识点和高频考题,涵盖基础理论、常用算法、C语言陷阱、操作系统原理、驱动开发、常见外设通信协议(如 I2C/SPI/UART)、RTOS、Linux 内核、以及实用电路知识等内容。

全部评论

相关推荐

昨天 21:24
已编辑
西安电子科技大学 硬件开发
硬件笔试:全部是选择题,30个单选+10个多选,笔试复习重点:知识广度为主。包括模电、数电(基础电路、放大电路、滤波器)、信号完整性与电磁兼容(了解就行)、通信协议(I2C、SPI、UART等)、自控、电路、PCB设计基础、信号与系统等。大部分题目是基础性的,考察是否掌握了核心知识点。只要扎实掌握基础,60分不是问题。华为官方给出的笔试攻略:主要涉及内容:模电、自动控制原理、常用元器件工作原理以及各条件下的工作状态(二极管特性等)、常见的拓扑电路(buck-boost)、PCB布线规则及设计原理、电路参数的简单计算、模电自控两本书基础概念等。一面1、自我介绍(简要介绍自己的学历背景、课设、毕设、成绩单等等)2、项目介绍(画项目框图、介绍原理图并且会当场画电路,问了某个或者某部分电路的作用。准备项目的时候,项目框图、电源树这些最好提前自己画一画)3、针对项目中的知识点开始深挖基础1)buck,boost电路原理和原理图2)画出三极管的工作特性图,静态工作点这些概念性的问题3)485&nbsp;232区别4)开关电源主要元器件,开关电源续流二极管有什么影响,选型需要考虑什么5)电阻类型、电阻功能6)怎么才算高速电路高频信号、怎么画高频信号7)问我对IIC是否熟悉,我说我上学期课设刚用过,就问了用IIC协议主机与从机之间电路设计要注意哪些地方(上拉电阻、串阻之类的)二面1、笔试了所做项目的原理图&nbsp;和pcb绘制过程中需要注意的问题2、三极管的简化图,电流流向及关系3、项目还有什么可以优化的地方,优化的目的是什么,优化的方法有哪些,需要考虑哪些因素4、MCU、FPGA如何选型5、画过几层板6、哪些因素会导致开关电源效率降低,如何解决7、LDO电源效率的计算;8、AD转换的精度由什么影响?什么样的AD转换速度最快?9、传输线损耗由哪几部分组成?10、DMA和中断的引发;11、EMC指标由哪几部分组成;综合问题1、毕业论文评了优秀论文,讲讲其中的技术难点2、在竞赛或项目中,在团队里扮演了什么角色,做出了什么贡献?3、在团队协作过程中,有没有产生过分歧,作为负责人你是怎么处理的?举一个具体的例子说明 4、如何处理与他人意见不一致的情况? 5、对华为的了解6、平时有什么爱好,有什么喜欢的运动?7、日常在学校里的一日时间是怎么安排的?8、未来的发展规划,着重说说工作前2~3年的规划9、如何看待加班10、为什么应聘该岗位#牛客创作赏金赛##你的秋招第一场笔试是哪家#
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客企业服务