嵌入式笔试刷题第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 给出下面的定义:

  1. 一个整型数;
  2. 一个指向整型数的指针;
  3. 一个指向指针的指针,它指向的指针是指向一个整型数;
  4. 一个有 10 个整型数的数组;
  5. 一个指向函数的指针,它指向的函数的参数只有一个,类型是字符串,且返回类型是整型。

答案:

int a1;                         // (1)
int *a2;                        // (2)
int **a3;                       // (3)
int a4[10];                     // (4)
int (*a5)(char *);              // (5)

第7题

题目:

C++中,分配在中的分别是什么数据?

答案:

  • 栈(Stack):局部变量、函数参数、返回地址等;
  • 堆(Heap):通过 newmalloc 等动态申请的内存。

第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 内核、以及实用电路知识等内容。

全部评论
已老实
点赞 回复 分享
发布于 今天 21:44 黑龙江
点赞 回复 分享
发布于 今天 21:40 山西
😄😄😄😄
点赞 回复 分享
发布于 今天 16:24 上海

相关推荐

评论
2
1
分享

创作者周榜

更多
牛客网
牛客企业服务