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

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)检查未定义行为。
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sagima_sdu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值