嵌入式八股-C语言30题(20240815)

ops/2024/9/25 2:32:48/

1. static 关键词的作用是什么?

static 关键词在C语言中有三种主要用途:

  • 局部变量:当static修饰局部变量时,该变量的生命周期延续至程序结束,但其作用域仅限于该函数内部,且该变量只会初始化一次。
  • 全局变量:当static修饰全局变量时,该变量的作用域仅限于定义它的文件,其他文件无法访问。
  • 静态函数static修饰的函数只能在定义它的文件中使用,不会暴露给其他文件。

2. static 修饰局部变量会用在什么时候?

static 修饰局部变量通常用于需要保持函数间调用状态的场合。例如,用于计数器、状态保存等需要在多次调用时保留上一次函数调用的变量值的情况下。

3. static 修饰全局变量,全局变量会在那个空间?

static 修饰的全局变量会存储在程序的静态存储区。该存储区用于存放程序的全局变量、静态变量以及常量等数据。

4. static 修饰函数时,函数的作用域是什么?

static 修饰函数时,函数的作用域限定在定义它的文件内部。其他文件无法调用这个函数,即使通过extern声明也无法访问。

5. extern 关键字的作用是什么?

extern 关键字用于声明一个变量或函数是在其他文件中定义的。它告诉编译器该变量或函数的定义在别的地方,编译时需要链接到正确的定义。通常用于多文件项目中,跨文件访问全局变量或函数。

6. volatile 关键字的作用是什么?

volatile 关键字用于告知编译器该变量可能会在程序之外的上下文中被更改,例如硬件中断或其他线程。它防止编译器对该变量进行优化,从而确保每次访问时都从内存中读取最新值。

7. sizeofstrlen 的区别是什么?

  • sizeof 是一个编译时运算符,用于计算数据类型或对象在内存中所占的字节数,包括末尾的空字符。
  • strlen 是一个函数,用于计算字符串的长度(不包括末尾的空字符),是在运行时计算的。

8. strcpymemcpy 的区别是什么?

  • strcpy 用于字符串复制,会将源字符串的内容复制到目标字符串,直到遇到'\0'
  • memcpy 用于任意类型数据的内存复制,需要指定复制的字节数,并且不会关心内容是否为字符串。

9. 如何理解变量的定义和使用?

  • 定义:变量的定义是为变量分配内存并指定其数据类型,例如int a;
  • 使用:变量的使用是指在程序中对已定义的变量进行赋值、运算或读取等操作。

10. 数组和指针的区别是什么?

  • 数组:数组是连续内存空间中相同数据类型的元素集合,数组名指向的是第一个元素的地址。
  • 指针:指针是一个变量,用于存储另一个变量的地址。指针可以指向任意类型的数据。

11. 回调函数的定义是什么?

回调函数是一种通过函数指针传递给另一函数,并在特定事件或条件下被调用的函数。常用于异步处理、事件驱动编程或状态机中。

12. 函数指针和指针函数的区别是什么?

  • 函数指针:是指向函数的指针,能够通过它调用指向的函数。
  • 指针函数:是返回值为指针的函数。

13. 空指针(NULL)和 void * 的区别是什么?

  • 空指针(NULL):表示不指向任何内存位置的指针。通常用于初始化或表示无效的指针。
  • void *:是通用指针,可以指向任何类型的数据,但需要在使用前进行类型转换。

14. 结构体与联合体之间的主要区别是什么?

  • 结构体:每个成员都有自己的内存空间,结构体的总大小是各个成员的大小之和。
  • 联合体:所有成员共享同一块内存空间,联合体的总大小是最大成员的大小。

15. 什么是内存泄漏?如何产生的?

内存泄漏是指程序在动态分配内存后未能释放,导致系统的内存资源无法被回收,最终可能导致程序或系统崩溃。通常发生在使用malloccalloc分配内存后,未调用free释放的情况下。

16. 什么是内存溢出?如何产生的?

内存溢出是指程序试图访问超过合法范围的内存地址,通常发生在数组越界、指针运算错误或递归过深时。它可能导致程序崩溃或不可预期的行为。

17. 堆和栈的区别是什么?

  • :用于动态内存分配,手动管理(如mallocfree),存储的数据生命周期由程序控制。
  • :用于自动内存分配,编译器管理,通常用于函数调用时的局部变量和返回地址。

18. 栈区和堆区的特点是什么?

  • 栈区:内存分配速度快,但空间有限,主要用于局部变量、函数调用等。
  • 堆区:内存分配灵活,适合大规模或动态数据,但管理相对复杂,需要手动分配和释放。

19. 常量区和代码区的定义是什么?

  • 常量区:存储程序中的常量和字符串字面量,通常是只读的。
  • 代码区:存储程序的可执行代码,是指令的存放区域,通常也是只读的。

20. 静态区的作用是什么?

静态区(也称为静态数据区)用于存放静态变量和全局变量,这些变量在程序整个生命周期内都存在,并初始化一次。静态区的内容在程序启动时初始化。

21. BSS 区和 Data 区的区别是什么?

  • BSS 区:存放未初始化的全局变量和静态变量,程序启动时自动清零。
  • Data 区:存放已初始化的全局变量和静态变量,程序启动时加载初始化值。

22. 大小端模式的定义是什么?

  • 大端模式:数据的高字节存放在低地址,低字节存放在高地址。
  • 小端模式:数据的低字节存放在低地址,高字节存放在高地址。

23. C 语言的编译过程包含哪些步骤?

C语言的编译过程通常包括以下几个步骤:

  1. 预处理:处理#include#define等指令,生成预处理后的文件。
  2. 编译:将预处理后的代码翻译成汇编代码。
  3. 汇编:将汇编代码转换成机器码,生成目标文件。
  4. 链接:将多个目标文件及库文件链接成可执行文件。

24. 预处理的作用是什么?

预处理阶段处理所有以#开头的预处理指令,包括文件包含、宏定义和条件编译。它会生成一个扩展后的源代码文件,准备交给编译器进行编译。

25. 编译阶段的主要任务是什么?

编译阶段的主要任务是将预处理后的源代码转换为汇编代码。编译器会进行语法检查、语义分析、优化等操作,并生成汇编代码文件。

26. 汇编阶段的主要任务是什么?

汇编阶段将编译器生成的汇编代码转换为机器码,即二进制形式的目标文件。这个文件包含程序的指令和数据,但还不是可执行文件。

27. 链接阶段的主要任务是什么?

链接阶段将多个目标文件和库文件合并,解析外部符号和地址,生成最终的可执行文件。链接器会把库函数和目标文件中的代码和数据链接在一起。

28. 如何避免内存泄漏?

避免内存泄漏的方法包括:

  • 在适当时机释放动态分配的内存(使用free)。
  • 避免使用后丢失对动态分配内存的引用。
  • 使用智能指针或内存管理库自动管理内存。

29. 动态内存分配和静态内存分配的区别是什么?

  • 动态内存分配:在程序运行时分配内存,大小

可以动态确定(如malloc),需要手动释放。

  • 静态内存分配:在编译时确定内存大小,存储在栈区或静态区,程序结束时自动释放。

30. 如何判断一个变量是否为野指针?

判断一个变量是否为野指针的方法包括:

  • 检查指针是否初始化。
  • 对于已释放的指针,及时将其置为NULL。
  • 使用调试工具(如Valgrind)检查未定义行为。

http://www.ppmy.cn/ops/95030.html

相关文章

算法日记day 39(动归之打家劫舍)

一、打家劫舍1 题目: 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。…

STM32cubeMX配置Systick的bug

STM32cubeMX版本:6.11.0 现象 STM32cubeMX配置Systick的时钟,不管选择不分频 还是8分频。 生成的代码都是一样的,代码都是不分频。 即不管选择不分频还是8分频,Systick都是使用的系统时钟 函数调用 HAL_Init() → HAL_Init…

html+css+js网页设计 服装设计网站10个页面

htmlcssjs网页设计 服装设计网站10个页面 带js 网页作品代码简单,可使用任意HTML编辑软件(如:Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作)。 获取源码 …

ActiveMQ、RabbitMQ、Kafka、RocketMQ在消息回溯、消息堆积+持久化、消息追踪、消息过滤的区别

ActiveMQ、RabbitMQ、Kafka、RocketMQ在消息回溯、消息堆积持久化、消息追踪、消息过滤等方面各有其独特的特点和优势。以下是这四个方面的详细比较: 1. 消息回溯 ActiveMQ:支持消息回溯功能。ActiveMQ可以将消息持久化到磁盘上,因此当需要…

高级java每日一道面试题-2024年8月15日-设计模式篇-工厂模式最主要的好处是什么?在哪里使用?

如果有遗漏,评论区告诉我进行补充 面试官: 工厂模式最主要的好处是什么?在哪里使用? 我回答: 工厂模式(Factory Pattern)是GoF设计模式中的一种创建型模式,其主要目的是封装创建对象的过程,使创建对象的过程与使用对象的过程…

关于路由和负载均衡

路由 想象你在一个大城市里,想去一个从未去过的新餐馆。你会怎么找到那里?你可能会用手机地图,对吧?地图告诉你从你现在的位置出发,应该先左转,再右转,走哪条街,过几个路口&#xf…

在 C++ 中实现一个简单的图形用户界面(GUI)应用

在 C 中实现一个简单的图形用户界面(GUI)应用 图形用户界面(GUI)应用程序是现代软件开发中不可或缺的一部分。它们为用户提供了直观的交互方式,使得操作更加简单和高效。本文将介绍如何在 C 中实现一个简单的 GUI 应用…

Postman文件上传接口测试

接口介绍 返回示例 测试步骤 1.添加一个新请求,修改请求名,填写URL,选择请求方式 2.将剩下的media参数放在请求body里,选择form-data,选择key右边的类型为file类型,就会出现选择文件的按钮Select Files&a…