当前位置: 首页 > java >正文

C/C++ 与嵌入式岗位常见笔试题详解

C/C++ 与嵌入式岗位常见笔试题详解

在嵌入式岗位的笔试题中,C 和 C++ 的基础考察非常常见,题目往往不复杂,但容易因为细节忽略而出错。下面我们结合几道经典的笔试题,整理成详细教程,帮助大家理清考点和易错点。


字符串拷贝的陷阱

题目背景

定义了一个函数 test,在函数中有一个字符数组 string,需要将传入的字符串拷贝到该数组中:

void test(char *str1) {char string[10];if (strlen(str1) <= 10) {strcpy(string, str1);}printf("%s\n", string);
}

问题分析

  1. strlen 计算规则

    • strlen 计算的是字符串中有效字符的个数,不包含结尾的 \0
    • 例如字符串 "0123456789",长度为 10,但实际存储时需要 11 个字节(包括结尾 \0)。
  2. 潜在问题

    • 数组 string 只有 10 个字节,如果传入字符串 "0123456789",拷贝时会多出 1 个字节导致越界写入
    • 拷贝后的 string 数组中没有正确的 \0 终止符,打印时会继续读取内存,可能输出乱码甚至引发安全漏洞。
  3. 正确修改

    • 判断条件应改为:
    if (strlen(str1) < sizeof(string)) {strcpy(string, str1);
    }
    
    • 这样保证字符串和结尾 \0 一共不会超过 10 个字节。

小结

这道题考察的是 字符串长度与存储空间的区别,以及 strlenstrcpy 的正确使用。


sizeof 运算符与数组/指针

题目背景

在 64 位系统下,int 占 4 字节,有如下代码:

int arr[10] = {0,1,2,3,4,5,6,7,8,9};
int *pt = arr;printf("%ld\n", sizeof(arr));
printf("%ld\n", sizeof(pt));

问题分析

  1. sizeof 不是函数,而是运算符,返回的是编译期确定的类型所占的字节数。

  2. 数组与指针的区别

    • sizeof(arr) → 整个数组大小 = 10 * sizeof(int) = 40
    • sizeof(pt) → 指针大小,在 64 位系统下是 8 字节

特殊情况:函数参数中的数组

void func(int arr[]) {printf("%ld\n", sizeof(arr));
}
  • 虽然写作 arr[],但在函数参数中它退化为指针,因此 sizeof(arr) 得到的是 指针大小,即 8,而不是数组大小。

小结

考察点在于 数组名和指针在某些情况下可以互换,但 sizeof 可以区分两者


文件大小的获取

题目背景

编写 C 代码获取一个文件的大小。

思路

  1. 使用 fopen 打开文件
  2. 使用 fseek(fp, 0, SEEK_END) 将文件指针定位到末尾
  3. 使用 ftell(fp) 获取当前位置(字节数)
  4. 使用 fclose 关闭文件

示例代码

#include <stdio.h>
#include <stdlib.h>int main() {FILE *fp = fopen("test.mp4", "rb");  // 只读方式打开文件if (fp == NULL) {perror("文件打开失败");return 1;}fseek(fp, 0, SEEK_END);  // 定位到文件末尾long size = ftell(fp);   // 获取当前位置(字节数)fclose(fp);              // 关闭文件printf("文件大小为: %ld 字节\n", size);return 0;
}

小结

本题考察 文件操作函数的基本功,尤其是 fseekftell 的配合使用。


幂函数中的未初始化变量

题目背景

代码如下:

int main() {int x = 10, y = 3, z;printf("%d\n", z);return 0;
}

问题分析

  • z 没有初始化,直接使用它会产生 未定义行为
  • 在不同编译器或不同运行环境下,可能输出随机数、0、垃圾值。

正确写法

int z = 0; // 或者赋值为其他确定值

小结

本题考察的是 变量初始化的重要性,尤其在嵌入式开发中,未初始化变量可能引发严重 bug。


总结

通过以上几道笔试题,我们可以提炼出几个高频考点:

  1. 字符串处理strlen 不包含 \0,拷贝字符串时必须考虑数组空间是否足够。
  2. 数组与指针sizeof 在数组与指针上的行为不同,函数参数中的数组会退化为指针。
  3. 文件操作:掌握 fopenfseekftellfclose 等函数的基本使用。
  4. 变量初始化:未初始化的变量会导致未定义行为,必须养成良好的初始化习惯。

这些题目虽然不复杂,但往往是嵌入式岗位笔试中最容易“失分”的地方。

http://www.xdnf.cn/news/18296.html

相关文章:

  • Mac电脑上虚拟机共享文件夹权限问题
  • vscode连接docker
  • WIFI国家码修改信道方法_高通平台
  • 精品方案 | GCKontrol与OMNeT++联合仿真在机载网络性能分析中的应用
  • mvdr波束形成
  • Linux系统之部署nullboard任务管理工具
  • ios八股文 -- Objective-c
  • iOS 应用上架常见问题与解决方案,多工具组合的实战经验
  • Node.js中的Prisma应用:现代数据库开发的最佳实践
  • 单片机通信协议核心关系梳理笔记(UART/USART/232/485/SPI/12C/LIN/BLE/WIFI)
  • leetcode7二分查找_69 and 34
  • 链表的核心:“增删改查”
  • Nginx 负载均衡和缓存配置
  • 【软考架构】净室软件工程
  • Gin自定义Error中间件
  • SQL-leetcode— 2356. 每位教师所教授的科目种类的数量
  • 手机 浏览器调用摄像头扫描二维码Quagga
  • 2026 济南淀粉深加工展览会亮点:玉米科技与未来产业发展
  • 03-dockerfile
  • C++继承中的虚函数机制:从单继承到多继承的深度解析
  • 【ansible】2.实施ansible playbook
  • 机器学习算法核心总结
  • 静/动态库 IIC(arm) day58
  • 医疗问答应用:UniApp + Node.js + DeepSeek API
  • Objective-C 版本的 LiveEventBus 效果
  • 直流无刷(BLDC)电机、单相直流无刷电机、三相直流无刷电机、单相直流无刷电机驱动芯片
  • 齐次线性方程组最小二乘解
  • 从零开始学AI——13
  • Docker复杂安装--最详细的MySQL主从复制与Redis集群安装、主从复制、主从扩容主从缩容实战版
  • java线程池相关知识