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

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.lryc.cn/news/627166.html

相关文章:

  • DataFrame中.iloc 属性
  • 动态规划----8.乘积最大子数组
  • Docker操作速查表
  • 海量数据测试指南与实战
  • Advanced Math Math Analysis |01 Limits, Continuous
  • C++/Qt开发:TCP通信连接软件测试方法:ECHO指令
  • PyTorch API 5
  • CorrectNav——基于VLM构建带“自我纠正飞轮”的VLN:通过「视觉输入和语言指令」预测导航动作,且从动作和感知层面生成自我修正数据
  • CoreShop微信小程序商城框架开启多租户-添加一个WPF客户端以便进行本地操作(5)
  • 当 AI 开始 “理解” 情绪:情感计算如何重塑人机交互的边界
  • 基于单片机环境火灾安全检测
  • NVIDIA Isaac Sim
  • 48 C++ STL模板库17-容器9-关联容器-映射(map)多重映射(multimap)
  • VR交通安全学习机-VR交通普法体验馆方案
  • 2026 济南淀粉深加工展览会亮点:玉米科技与未来产业发展
  • IPSEC安全基础
  • C++智能指针详解:告别内存泄漏,拥抱安全高效
  • 【科研绘图系列】R语言绘制平滑曲线折线图
  • AI重塑软件测试:质量保障的下一站
  • MySQL分库分表与MyCAT
  • PiscCode集成Hand Landmarker:实现高精度手部姿态检测与分析
  • C语言:第18天笔记
  • Google Chrome扩展不受信任 - 不受支持的清单版本 解决方案 -- Chrome扩展插件无法加载 扩展程序无法使用 解决方案
  • PiscCode使用MediaPipe Face Landmarker实现实时人脸特征点检测
  • vue3 el-select 默认选中第一个
  • 基础笔记8.20
  • 8.20网络编程——sqlite3数据库
  • lua入门以及在Redis中的应用
  • 技术干货|使用Prometheus+Grafana监控redis实例详解
  • 自学嵌入式第二十三天:数据结构(3)-双链表