嵌入式大厂面经第 7(持续更新中!)
这是一个嵌入式大厂面试题专栏,每天更新高频面试题。专栏将包含题目描述、详细解析、相关知识点扩展以及实际代码示例。内容涵盖操作系统、驱动开发、通信协议等核心领域,并结合实际项目经验进行分析。每道题目都会附带面试官可能的追问方向,帮助大家更好地准备面试!
1. 指针常量和常量指针
常量指针(const pointer)
- 指向内容可以改变,但指针本身不能改变指向
int num1 = 10, num2 = 20; int* const ptr = &num1; // 指针常量 *ptr = 30; // 正确:可以修改指向的值 // ptr = &num2; // 错误:不能修改指针指向
指针常量(pointer to const)
- 指针可以改变指向,但不能通过指针修改指向的内容
int num1 = 10, num2 = 20; const int* ptr = &num1; // 指向常量的指针 ptr = &num2; // 正确:可以改变指向 // *ptr = 30; // 错误:不能修改指向的值
2. 栈和堆的区别
栈(Stack)
- 特点系统自动管理空间较小存取速度快连续的内存空间
- 使用场景
void stackExample(void) { int array[5]; // 栈上分配 char str[10]; // 栈上分配 struct Point p = {1,2}; // 栈上分配 } // 函数结束自动释放
堆(Heap)
- 特点手动管理空间较大存取速度相对较慢不连续的内存空间
- 使用场景
void heapExample(void) { int* array = (int*)malloc(5 * sizeof(int)); // 堆上分配 char* str = (char*)malloc(10); // 堆上分配 // 使用完需要手动释放 free(array); free(str); }
3. malloc和new的区别
malloc(C语言)
- 特点函数,需要指定大小返回void指针,需要类型转换不调用构造函数需要手动计算大小
- 使用示例
// malloc使用示例 struct Student { char name[20]; int age; }; void mallocExample(void) { // 分配内存 struct Student* s = (struct Student*)malloc(sizeof(struct Student)); if(s != NULL) { strcpy(s->name, "Tom"); s->age = 20; free(s); // 释放内存 s = NULL; // 避免悬空指针 } }
new(C++)
- 特点运算符,自动计算大小返回具体类型指针自动调用构造函数可以进行数组初始化
- 使用示例
class Student { public: Student(const char* n, int a) : age(a) { strcpy(name, n); } ~Student() {} private: char name[20]; int age; }; void newExample() { // 分配单个对象 Student* s1 = new Student("Tom", 20); // 调用构造函数 // 分配数组 Student* s2 = new Student[10]; // 调用默认构造函数 // 释放内存 delete s1; // 调用析构函数 delete[] s2; // 调用数组每个元素的析构函数 }
关键区别总结
- 内存分配malloc:需要手动计算大小new:自动计算所需空间
- 类型安全malloc:返回void*,需要强制类型转换new:返回对应类型指针
- 构造/析构malloc:不调用构造函数new:自动调用构造函数和析构函数
- 错误处理malloc:返回NULL表示分配失败new:抛出异常std::bad_alloc
- 数组处理malloc:需要手动计算总大小new:使用new[]和delete[]处理数组
更多内容全在下方专栏
全网最受欢迎的嵌入式笔试专栏
笔试专栏包含全部最新的笔试必考考点,非常适合在找工作面经薄弱的同学
3000+订阅还会涨价,提前订阅提前享受,持续更新中。
专栏链接:https://www.nowcoder.com/creation/manager/columnDetail/mPZ4kk
#满分简历要如何准备?##嵌入式笔面经分享##嵌入式测试,嵌入式开发#