欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 建筑 > 嵌入式面试笔试那点事2:2025.4.13

嵌入式面试笔试那点事2:2025.4.13

2025/6/26 16:08:57 来源:https://blog.csdn.net/m0_75180351/article/details/147188420  浏览:    关键词:嵌入式面试笔试那点事2:2025.4.13

做了某厂的笔试题,全程监控监考压力还是挺大的。。。挑几个博主记得比较清楚的有价值的简答题写写。

一、详细从生命周期、作用域等方面说明普通局部变量、普通全局变量、静态局部变量、静态全局变量

1. 普通局部变量

  • 定义: 在某个函数或代码块内部定义的变量。
  • 作用域: 仅在定义它的函数或代码块内有效。
  • 生命周期: 该变量在函数或代码块开始执行时被创建,当函数或代码块执行结束后,变量被销毁。
  • 特点: 每次进入函数时都会重新创建,并且不同的函数或调用中相同名字的局部变量是相互独立的。

2. 普通全局变量

  • 定义: 在所有函数外部定义的变量。
  • 作用域: 整个程序,所有函数都可以访问和修改。
  • 生命周期: 从程序开始执行时创建,直到程序结束时被销毁。
  • 特点: 由于可以在多个函数之间共享数据,容易造成意外修改,需谨慎使用。

3. 静态局部变量

  • 定义: 在函数内定义,并用 static 关键字修饰的变量。
  • 作用域: 仅在定义它的函数内有效。
  • 生命周期: 该变量在程序执行时创建,并在程序结束后才被销毁。即使函数结束,变量的值会被保留。
  • 特点: 用于保留函数调用之间的状态,适合需要记住上次调用状态的情况下使用。

4. 静态全局变量

  • 定义: 在所有函数外部定义,并用 static 关键字修饰的变量。
  • 作用域: 限于定义它的文件内,其他文件不能访问(文件作用域)。
  • 生命周期: 与普通全局变量相同,从程序开始执行时创建,直到程序结束时被销毁。
  • 特点: 防止名称冲突,适合于多文件项目中,确保变量不会被其他文件中的同名变量影响。

小结

类型作用域生命周期例子
普通局部变量函数内函数调用期间int a;
普通全局变量整个程序从程序开始到结束int b;
静态局部变量函数内从程序开始到结束static int c;
静态全局变量文件内从程序开始到结束static int d;

二、变量声明和定义的区别 

1. 变量声明

  • 定义: 变量声明是告诉编译器变量的名称和类型,但不为该变量分配内存
  • 作用: 主要用于在一个作用域内,可以使用该变量,允许编译器在随后的代码中识别该变量。
  • 特点:
    • 可以在多个地方进行声明。
    • 声明不会占用内存(在某些情况下,特别是在头文件中使用 extern 声明时)。
    • 示例:
      extern int x; // 声明,表示 x 是一个整数类型的变量,但未定义(未分配内存)
      

2. 变量定义

  • 定义: 变量定义不仅包括变量的名称和类型,还包括分配内存以存储该变量的值。
  • 作用: 创建变量的实际存储,并允许在程序中使用该变量进行读写操作。
  • 特点:
    • 在同一作用域内每个变量只能定义一次。
    • 定义会占用内存。
    • 示例:
      int x; // 定义,表示创建一个整数类型的变量 x,并为其分配内存
      

总结

特性声明定义
定义内容名称和类型名称、类型和存储空间
内存占用不占用占用内存
允许次数可以多次声明同一作用域内只能定义一次
示例extern int x;int x;

小结

  • 声明用于告诉编译器变量的存在,其本身不分配内存。
  • 定义则是实际创建变量并为其分配内存。

变量声明和定义的区别关系到程序的整体结构和模块化,特别是在大型项目或模块化代码中,合理使用声明和定义可以提高代码的可读性和维护性。

三、描述C语言源代码是如何转化为可执行文件的

C语言源代码的转化过程涉及多个步骤,从源代码到可执行文件的生成,每一步都至关重要。以下是详细的转换过程:

1. 编写源代码

  • 步骤: 开发者使用文本编辑器编写 C 语言源代码,文件通常以 .c 为扩展名。

2. 预处理 (Preprocessing)

  • 工具: C 预处理器 (如 cpp)
  • 过程:
    • 处理以 # 开头的指令,例如 #include#define
    • 所有的宏定义、条件编译和文件包含都会在这一阶段被处理。
    • 结果是一个扩展名为 .i 的中间文件,包含了经过处理的源代码。

3. 编译 (Compilation)

  • 工具: C 编译器 (如 gcc)
  • 过程:
    • 将预处理后的代码(.i 文件)翻译成汇编语言。
    • 生成一个扩展名为 .s 的汇编语言文件。
    • 这个过程中会进行语法分析、语义分析及优化。

4. 汇编 (Assembly)

  • 工具: 汇编器 (如 as)
  • 过程:
    • 将汇编语言文件(.s 文件)转化为机器代码。
    • 生成一个目标文件,通常以 .o.obj 为扩展名,包含了二进制机器代码,但尚未完全链接。

5. 链接 (Linking)

  • 工具: 链接器 (如 ld)
  • 过程:
    • 将一个或多个目标文件(.o 文件)链接在一起,包含标准库或其他库(如操作系统提供的库)。
    • 处理外部符号引用,将不同目标文件中的符号和地址修正,生成最终的可执行文件。
    • 结果是一个可执行文件,通常以无扩展名或 .exe (在 Windows 中)结尾。

6. 生成可执行文件

  • 结果: 此时经过链接的目标文件变成了可执行文件,可以运行该程序。

小结

整个过程可以简化为以下几点:

  1. 源码 (.c) ➔ 预处理汇编代码 (.s)
  2. 汇编代码 (.s) ➔ 汇编目标文件 (.o)
  3. 目标文件 (.o) ➔ 链接可执行文件

四、 简要说明union在C语言程序中的作用

1. 内存节省

  • 作用: union 共享相同的内存空间,这意味着在同一时间只能存放一个成员的值。
  • 特点: 联合体的大小等于其最大成员的大小,这使得在需要存储多种类型但只使用其中一种的情况下节省内存。

2. 类型灵活性

  • 作用: union 允许在运行时根据需要使用不同的数据类型,这对处理多种数据输入或输出非常有用。
  • 特点: 可以将一个 union 声明为多种类型,这使得代码能够灵活处理不同数据格式。

3. 数据结构

  • 作用: 与结构体结合使用,union 可以构建更复杂的数据结构,例如在实现数据表、数据库记录或多态数据接口时。
  • 特点: 可以嵌套使用 unionstruct,便于管理复杂数据。

4. 高效的数据处理

  • 作用: 在某些情况下,例如操作硬件寄存器或进行位操作,使用 union 可以方便地管理数据。
  • 特点: 可以通过不同的类型访问同一块内存,提高了数据处理的效率。

示例

以下是一个简单的 union 示例,展示了如何在程序中使用联合体:

#include <stdio.h>union Data {int intValue;float floatValue;char charValue;
};int main() {union Data data;data.intValue = 10;printf("Integer: %d\n", data.intValue);data.floatValue = 220.5;printf("Float: %f\n", data.floatValue); // 注意,这里可能会产生不可预知的结果,因为数据覆盖了之前的值。data.charValue = 'A';printf("Char: %c\n", data.charValue); // 同样,这个值覆盖了之前的 float。return 0;
}

结论

  • 内存节省: 适用于需要存储不同类型但不需同时存储多个值的场景。
  • 灵活性与效率: 提高了数据结构的灵活性与访问效率。
  • 复杂数据处理: 在构建复杂数据结构时,union 显得非常有用。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词