嵌入式笔试刷题第8天
✅ 第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)
:数组str
是初始化为"http://localhost"
(长度 17,含结尾 \0),但定义为数组,数组大小为 17。sizeof(p1)
:p1
是一个指针,32 位系统指针大小为 4。sizeof(p2)
:void *
指针,大小也是 4。sizeof(n)
:整型,32 位系统中为 4。sizeof(struct_a)
: 成员:int n(4字节)+ char str[10](10字节);结构体可能有字节对齐,填充到 16 字节,所以为 16。sizeof(str)
(在Foo
中):传入的是数组名退化为指针,因此为 4。
最终输出:
17 4 4 4 16 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
,效率略低。 - 第二种写法:先判断一次
condition
,然后统一循环,提高效率,更优。
优缺点对比:
可读性 | 高 | 中 |
执行效率 | 每次循环判断条件 | 判断一次即可 |
是否推荐 | 条件变化时适用 | 条件不变时更优 |
✅ 第3题
题目:
请问运行下面的 Test
函数会有什么样的结果?
char *GetMemory(void) { char p[] = "hello world"; return p; } void Test(void) { char *str = NULL; str = GetMemory(); printf(str); }
答案:
p
是函数内部的局部数组,函数返回后p
指向的内存被释放。- 返回该地址并使用会导致未定义行为(通常会打印乱码或崩溃)。
正确做法:
- 应使用
malloc
分配内存,或使用static
修饰数组。
✅ 第4题
题目:
用预处理指令 #define
声明一个常数,用以表明 1 年中有多少秒(忽略闰年问题)。
答案:
#define SECONDS_PER_YEAR (365 * 24 * 60 * 60)
✅ 第5题
题目:
请写出一个无限循环。
答案:
while (1) { } 或 for (;;) { }
✅ 第6题
题目:
用变量 a
给出下面的定义:
- 一个整型数;
- 一个指向整型数的指针;
- 一个指向指针的指针,它指向的指针是指向一个整型数;
- 一个有 10 个整型数的数组;
- 一个指向函数的指针,它指向的函数的参数只有一个,类型是字符串,且返回类型是整型。
答案:
int a1; // (1) int *a2; // (2) int **a3; // (3) int a4[10]; // (4) int (*a5)(char *); // (5)
✅ 第7题
题目:
C++中,分配在栈和堆中的分别是什么数据?
答案:
- 栈(Stack):局部变量、函数参数、返回地址等;
- 堆(Heap):通过
new
或malloc
等动态申请的内存。
✅ 第8题
题目:
请简单描述一下“内存对齐”的问题(什么是“内存对齐”?为什么要这样做?)。
答案:
- 内存对齐:变量在内存中的地址必须是其类型大小的整数倍;
- 原因: 提高访问效率;某些平台对非对齐访问会抛出异常;对齐可减少 CPU 访问周期。
✅ 第9题
题目:
程序什么时候应该使用多线程,什么时候应该使用单线程?
答案:
- 使用多线程:有并发处理需求;I/O 密集或 CPU 密集;用户界面响应需要异步处理。
- 使用单线程:任务简单、线性;无资源竞争;嵌入式系统资源受限。
✅ 第10题
题目:
请编程实现一个函数:传入一个八位无符号整数,生成并返回此数的二进制数倒序字符串。
举例:传入:177 =
10110001
返回:
"10001101"
答案:
char *reverseBits(uint8_t n) { static char res[9]; for (int i = 0; i < 8; i++) { res[i] = (n & (1 << i)) ? '1' : '0'; } res[8] = '\0'; return res; }
嵌入式笔试专栏 文章被收录于专栏
本专栏系统整理了嵌入式方向笔试中常见的知识点和高频考题,涵盖基础理论、常用算法、C语言陷阱、操作系统原理、驱动开发、常见外设通信协议(如 I2C/SPI/UART)、RTOS、Linux 内核、以及实用电路知识等内容。