嵌入式大厂面经 6(持续更新中!)

这是一个嵌入式大厂面试题专栏,每天更新高频面试题。专栏将包含题目描述、详细解析、相关知识点扩展以及实际代码示例。内容涵盖操作系统、驱动开发、通信协议等核心领域,并结合实际项目经验进行分析。每道题目都会附带面试官可能的追问方向,帮助大家更好地准备面试!

1. 内存对齐

基本概念

  • CPU访问内存时,按照特定字节大小(对齐边界)进行访问
  • 提高内存访问效率,但可能造成内存空间浪费
// 内存对齐示例
struct Example1 {    // 不优化
    char a;         // 1字节
    double b;       // 8字节
    int c;          // 4字节
};  // 总大小24字节

struct Example2 {    // 优化排序
    double b;       // 8字节
    int c;          // 4字节
    char a;         // 1字节
};  // 总大小16字节

// 指定对齐方式
#pragma pack(1)     // 1字节对齐
struct Example3 {
    char a;
    double b;
    int c;
};  // 总大小13字节
#pragma pack()      // 恢复默认对齐

2. 内存泄漏

定义

  • 程序申请的内存空间未被正确释放
  • 导致可用内存逐渐减少

常见情况和解决方法

// 1. 常见内存泄漏
void badFunction(void) {
    int *p = (int*)malloc(sizeof(int));
    return;     // 忘记释放内存
}

// 2. 正确的内存管理
void goodFunction(void) {
    int *p = (int*)malloc(sizeof(int));
    // 使用内存
    free(p);    // 释放内存
    p = NULL;   // 避免悬空指针
}

// 3. 智能指针思想(C++)
class SmartPtr {
    int* ptr;
public:
    SmartPtr(int* p) : ptr(p) {}
    ~SmartPtr() { delete ptr; }
};

3. 数组名和指针

主要区别

  1. 本质不同数组名:表示整个数组的起始地址,是常量指针:可变的地址变量
  2. 内存分配数组:编译时分配连续空间指针:运行时可动态分配
void arrayPointerExample(void) {
    int arr[5] = {1, 2, 3, 4, 5};
    int *ptr = arr;  // 指针指向数组首地址
    
    // 数组名不能被修改
    // arr = ptr;    // 错误:数组名是常量
    ptr = arr;       // 正确:指针可以修改

    // 大小不同
    printf("sizeof(arr) = %d\n", sizeof(arr));    // 输出20(5*4字节)
    printf("sizeof(ptr) = %d\n", sizeof(ptr));    // 输出4或8(指针大小)
    
    // 数组访问
    printf("%d %d\n", arr[0], ptr[0]);    // 两种方式等价
    printf("%d %d\n", *(arr+1), *(ptr+1)); // 指针运算等价
}

关键注意点

  1. 数组作为函数参数
// 数组作为参数会退化为指针
void function1(int arr[]) {
    // sizeof(arr)此时等于指针大小
}

// 建议使用指针+大小的方式
void function2(int *arr, int size) {
    for(int i = 0; i < size; i++) {
        // 处理数组元素
    }
}

  1. 二维数组和指针
void twoDimensionExample(void) {
    int arr[3][4];
    int (*p)[4] = arr;    // 数组指针
    
    // 访问方式
    arr[1][2] = 10;       // 数组方式
    *(*(p + 1) + 2) = 10; // 指针方式
}

这些概念在C语言中都非常重要,正确理解和使用它们可以帮助我们写出更高效、更可靠的代码。

嵌入式面试八股文全集 文章被收录于专栏

这是一个全面的嵌入式面试专栏。主要内容将包括:操作系统(进程管理、内存管理、文件系统等)、嵌入式系统(启动流程、驱动开发、中断管理等)、网络通信(TCP/IP协议栈、Socket编程等)、开发工具(交叉编译、调试工具等)以及实际项目经验分享。专栏将采用理论结合实践的方式,每个知识点都会附带相关的面试真题和答案解析。

全部评论
点赞 回复 分享
发布于 昨天 09:07 山西
很好
点赞 回复 分享
发布于 昨天 16:03 黑龙江
😱😱😱😱😱😱😱😱
点赞 回复 分享
发布于 今天 10:12 上海

相关推荐

🔥&nbsp;2024春招必备&nbsp;|&nbsp;嵌入式开发面试八股文合集&nbsp;📚亲爱的嵌入式开发小伙伴们,春招季即将到来!🌸&nbsp;是时候武装自己的知识库,准备迎接面试挑战啦!我们精心整理了这份嵌入式开发面试八股文合集,帮助你在2024春招中脱颖而出!💪嵌入式面试八股文合集:https://www.nowcoder.com/creation/manager/columnDetail/mPZ4kk📌&nbsp;C语言基础篇1️⃣&nbsp;指针与内存-&nbsp;指针常量vs常量指针的区别?-&nbsp;野指针和悬空指针的成因及如何避免?-&nbsp;内存对齐的原理及实际意义?-&nbsp;如何实现一个安全的strcpy函数?-&nbsp;malloc/free与new/delete的区别?2️⃣&nbsp;预处理与编译-&nbsp;宏定义的优缺点及注意事项?-&nbsp;static关键字的五种用法?-&nbsp;volatile关键字的作用及应用场景?-&nbsp;程序的内存分布(代码段、数据段、BSS段、堆、栈)?-&nbsp;编译过程的四个阶段及其作用?💻&nbsp;数据结构与算法1️⃣&nbsp;基础数据结构-&nbsp;链表:如何检测链表中的环?-&nbsp;栈与队列:应用场景及区别?-&nbsp;树:二叉树的遍历方式及应用?-&nbsp;哈希表:解决冲突的方法?2️⃣&nbsp;常见算法-&nbsp;排序算法的时间复杂度对比?-&nbsp;二分查找的实现及优化?-&nbsp;嵌入式系统中的内存优化算法?-&nbsp;位操作在嵌入式中的应用?🐧&nbsp;Linux系统编程1️⃣&nbsp;进程与线程-&nbsp;进程与线程的区别?-&nbsp;进程间通信的方式及优缺点?-&nbsp;线程同步的方法?-&nbsp;死锁的条件及预防措施?2️⃣&nbsp;文件与IO-&nbsp;文件描述符的概念及管理?-&nbsp;阻塞IO&nbsp;vs&nbsp;非阻塞IO&nbsp;vs&nbsp;异步IO?-&nbsp;select/poll/epoll的区别及应用场景?-&nbsp;Linux设备驱动的基本框架?🔌&nbsp;嵌入式硬件与通信1️⃣&nbsp;STM32开发-&nbsp;STM32启动过程详解?-&nbsp;中断优先级管理及嵌套?-&nbsp;DMA工作原理及应用场景?-&nbsp;定时器的工作模式及配置?2️⃣&nbsp;通信协议-&nbsp;I2C、SPI、UART的区别及应用场景?-&nbsp;CAN总线的特点及应用?-&nbsp;Modbus协议的帧格式及异常处理?-&nbsp;TCP/IP协议栈在嵌入式系统中的实现?⚡&nbsp;实时操作系统1️⃣&nbsp;RTOS基础-&nbsp;什么是实时操作系统?硬实时vs软实时?-&nbsp;FreeRTOS的任务调度机制?-&nbsp;信号量、互斥量、消息队列的使用场景?-&nbsp;优先级反转问题及解决方案?2️⃣&nbsp;系统设计-&nbsp;嵌入式系统的启动流程设计?-&nbsp;低功耗设计的关键技术?-&nbsp;看门狗的工作原理及应用?-&nbsp;嵌入式系统的可靠性设计?📝&nbsp;实战经验分享1️⃣&nbsp;调试技巧-&nbsp;如何高效定位内存泄漏问题?-&nbsp;使用JTAG/SWD进行硬件调试的技巧?-&nbsp;常见的嵌入式系统崩溃原因分析?-&nbsp;性能瓶颈分析与优化方法?2️⃣&nbsp;项目经验-&nbsp;如何设计一个可靠的通信协议栈?-&nbsp;嵌入式产品的测试策略?-&nbsp;固件升级(OTA)的实现方案?-&nbsp;嵌入式系统安全性设计的关键点?---🎯&nbsp;2024春招备战指南:1.&nbsp;每天复习1-2个知识点,一个月就能覆盖全部重点!2.&nbsp;结合实际项目经验,准备2-3个可深入讲解的案例3.&nbsp;刷题平台上针对性练习算法题,提高编程能力4.&nbsp;模拟面试,锻炼表达能力和逻辑思维💼&nbsp;面试技巧:-&nbsp;遇到不会的问题,坦诚表达并展示解决问题的思路-&nbsp;主动展示自己的项目经验和技术亮点-&nbsp;准备一些有深度的问题向面试官提问-&nbsp;保持积极的学习态度和良好的沟通能力🌟&nbsp;祝各位嵌入式开发者在2024春招中取得理想的offer!记住:机会总是留给有准备的人!加油!💯
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务