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);
}
问题分析
-
strlen
计算规则strlen
计算的是字符串中有效字符的个数,不包含结尾的\0
。- 例如字符串
"0123456789"
,长度为 10,但实际存储时需要 11 个字节(包括结尾\0
)。
-
潜在问题
- 数组
string
只有 10 个字节,如果传入字符串"0123456789"
,拷贝时会多出 1 个字节导致越界写入。 - 拷贝后的
string
数组中没有正确的\0
终止符,打印时会继续读取内存,可能输出乱码甚至引发安全漏洞。
- 数组
-
正确修改
- 判断条件应改为:
if (strlen(str1) < sizeof(string)) {strcpy(string, str1); }
- 这样保证字符串和结尾
\0
一共不会超过 10 个字节。
小结
这道题考察的是 字符串长度与存储空间的区别,以及 strlen
和 strcpy
的正确使用。
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));
问题分析
-
sizeof
不是函数,而是运算符,返回的是编译期确定的类型所占的字节数。 -
数组与指针的区别:
sizeof(arr)
→ 整个数组大小 =10 * sizeof(int)
= 40sizeof(pt)
→ 指针大小,在 64 位系统下是 8 字节
特殊情况:函数参数中的数组
void func(int arr[]) {printf("%ld\n", sizeof(arr));
}
- 虽然写作
arr[]
,但在函数参数中它退化为指针,因此sizeof(arr)
得到的是 指针大小,即 8,而不是数组大小。
小结
考察点在于 数组名和指针在某些情况下可以互换,但 sizeof
可以区分两者。
文件大小的获取
题目背景
编写 C 代码获取一个文件的大小。
思路
- 使用
fopen
打开文件 - 使用
fseek(fp, 0, SEEK_END)
将文件指针定位到末尾 - 使用
ftell(fp)
获取当前位置(字节数) - 使用
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;
}
小结
本题考察 文件操作函数的基本功,尤其是 fseek
和 ftell
的配合使用。
幂函数中的未初始化变量
题目背景
代码如下:
int main() {int x = 10, y = 3, z;printf("%d\n", z);return 0;
}
问题分析
z
没有初始化,直接使用它会产生 未定义行为。- 在不同编译器或不同运行环境下,可能输出随机数、0、垃圾值。
正确写法
int z = 0; // 或者赋值为其他确定值
小结
本题考察的是 变量初始化的重要性,尤其在嵌入式开发中,未初始化变量可能引发严重 bug。
总结
通过以上几道笔试题,我们可以提炼出几个高频考点:
- 字符串处理:
strlen
不包含\0
,拷贝字符串时必须考虑数组空间是否足够。 - 数组与指针:
sizeof
在数组与指针上的行为不同,函数参数中的数组会退化为指针。 - 文件操作:掌握
fopen
、fseek
、ftell
、fclose
等函数的基本使用。 - 变量初始化:未初始化的变量会导致未定义行为,必须养成良好的初始化习惯。
这些题目虽然不复杂,但往往是嵌入式岗位笔试中最容易“失分”的地方。