嵌入式笔试(第四天)
嵌入式笔试题汇总(前 10 题)
1. 某 32 位系统下,C 程序,请写出输出结果:
void Foo(char str[100]){ printf("%d\n", sizeof(str)); } int main(int argc, char **argv){ char str[] = "http://localhost"; char *p1 = str; void *p2 = malloc(100); int n = 10; struct A { int n; char str[10]; } struct_a; printf("%d\n", sizeof(str)); printf("%d\n", sizeof(p1)); printf("%d\n", sizeof(p2)); printf("%d\n", sizeof(n)); printf("%d\n", sizeof(struct_a)); Foo(str); return 0; }
答案:
sizeof(str)
:18(字符串常量初始化,包含\0
)sizeof(p1)
:4(指针大小,32 位系统)sizeof(p2)
:4(void 指针大小)sizeof(n)
:4(int 类型)sizeof(struct_a)
:16(结构体包含对齐)Foo(str)
中的sizeof(str)
:4(函数参数退化为指针)
2. 简述以下两段关于循环的程序的优缺点:
第一种写法:
for (i = 0; i < N; i++) { if (condition) DoSomething(); else DoOtherthing(); }
第二种写法:
if (condition) { for (i = 0; i < N; i++) DoSomething(); } else { for (i = 0; i < N; i++) DoOtherthing(); }
答案:
- 第一种写法逻辑简单、灵活,适合
condition
可能在运行时变化的情况,但循环中每次都判断一次if
,效率略低。 - 第二种写法效率更高,避免了循环体内重复判断,但结构固定,适合条件不变的场景。
3. 运行下面的 Test
函数会有什么样的结果?
char *GetMemory(void) { char p[] = "hello world"; return p; } void Test(void) { char *str = NULL; str = GetMemory(); printf(str); }
答案:
GetMemory
返回的是一个局部变量的地址,函数返回后内存失效,str
指向无效地址,会导致未定义行为,可能输出乱码或程序崩溃。
4. 用预处理指令 #define
声明一个常数,表示一年有多少秒(忽略闰年问题)。
#define SECONDS_IN_YEAR (365 * 24 * 60 * 60)
5. 请写出一个无限循环。
while (1) { // do something }
或
for (;;) { // do something }
6. 用变量 a
给出下面的定义:
- 一个整型数:
- 一个指向整型数的指针:
- 一个指向指针的指针,它指向的指针是指向一个整型数:
- 一个有 10 个整型数的数组:
- 一个指向函数的指针,它指向的函数参数是字符串,返回类型为整型:
7. C++ 中,分配在栈和堆中的分别是什么数据?
答案:
- 栈(Stack):局部变量、函数参数
- 堆(Heap):动态分配的内存(通过
new
或malloc
)
8. 简述“内存对齐”问题:
答案:
内存对齐是指数据在内存中的地址必须是其类型大小的整数倍。其作用是提高 CPU 访问效率,避免跨字节或跨字节块访问导致的性能问题。内存对齐通过插入填充字节来实现。
9. 程序什么时候应该使用多线程,什么时候使用单线程?
答案:
- 使用多线程:存在耗时操作(如 I/O、网络)需要响应多个任务并行处理多核 CPU 下可提升性能
- 使用单线程:程序逻辑简单没有耗时阻塞操作对调试和同步要求高的场合
10. 编程题:传入一个 8 位无符号整数,生成其二进制反转字符串
示例:
输入:177(二进制为 10110001
)
输出:"10001101"
答案(C 实现):
char* reverseBits(unsigned char num) { static char result[9]; for (int i = 0; i < 8; i++) { result[i] = ((num >> i) & 1) ? '1' : '0'; } result[8] = '\0'; return result; }
嵌入式笔试专栏 文章被收录于专栏
本专栏系统整理了嵌入式方向笔试中常见的知识点和高频考题,涵盖基础理论、常用算法、C语言陷阱、操作系统原理、驱动开发、常见外设通信协议(如 I2C/SPI/UART)、RTOS、Linux 内核、以及实用电路知识等内容。