【C语言基础】嵌入式面试经典题(C语言篇)----有新的内容会及时补充、更新!

本文概述了C语言中进程与线程的区别,变量存储区域(栈、全局变量、静态局部变量),const和static的关键字作用,指针概念,栈与堆的差异,内存泄漏的定义,以及单片机程序跑飞及其原因。详细描述了C语言从源代码到可执行程序的编译流程。
摘要由CSDN通过智能技术生成

📢:如果你也对机器人、人工智能感兴趣,看来我们志同道合✨
📢:不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852
📢:文章若有幸对你有帮助,可点赞 👍 收藏 ⭐不迷路🙉
📢:内容若有错误,敬请留言 📝指正!原创文,转载请注明出处


进程和线程有什么区别?

答:进程是并发执行的程序在执行过程中分配和管理资源的基本单位。线程是进程的一个执行单元,是比进程还要小的独立运行的基本单位。一个程序至少有一个进程,一个进程至少有一个线程。

程序的局部、全局变量存在于哪里,动态申请数据存在于哪里?

答:程序的局部变量存在于栈区;全局变量存在于静态区;动态申请数据存在于堆区。

静态局部变量和全局变量的区别

答:静态局部变量的这种特性,和全局变量非常相似。他们的相同点都是创造和初始化一次,以后调用时值保持上次的不变。不同点在于作用域不同。

关键字const有什么作用?

答:用const定义的变量的值是不允许改变的,即不允许给它重新赋值,即使是赋相同的值也不可以。所以说它定义的是只读变量,这也就意味着必须在定义的时候就给它赋初值。

关键字static有什么作用?

答:在C语言中,关键字static有三个明显的作用:

  1. 在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。
  2. 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。
  3. 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。

局部变量能否和全局变量重名?

答:能,局部会屏蔽全局。
局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。
对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体内。

Union和结构体之间的区别

答:结构体类似于一个包裹,结构体中的成员彼此是独立存在的,分布在内存的不同单元中,他们只是被打包成一个整体叫做结构体而已;共用体中的各个成员其实是一体的,彼此不独立,他们使用同一个内存单元。可以理解为:有时候是这个元素,有时候是那个元素。更准确的说法是同一个内存空间有多种解释方式。

什么是指针?

答:指针的实质就是个变量,它跟普通变量没有任何本质区别。指针完整的名字应该叫指针变量,简称为指针。指针的出现是为了实现CPU间接访问内存地址。

栈和堆的区别?

答:栈区别于堆,它是自主管理内存的;堆管理内存分配灵活,按需分配,也就是程序手动申请&释放:手工意思是需要写代码去申请malloc和释放free。各进程可以按需申请使用,使用完释放。大的进程放入到堆内存中,小的进程放入栈中,两种的特征决定了处理不同的进程。
1.申请方式不同。栈的空间由操作系统自己分配和释放,堆上的空间手动分配和释放。
2.申请效率不同。栈由系统自动分配,速度较快,但程序员是无法控制的。堆是由new分配的内存,一般速度较慢,而且容易产生内存碎片,不过用起来最方便。
3.申请大小不同。栈空间有限。在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在WINDOWS下,栈的大小是2M(也有的说是1M,总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示overflow。因此,能从栈获得的空间较小
堆是很大的自由存储区。堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。

什么是内存泄漏?

答:在调用free归还(释放)这段内存之前,指向这段内存的指针p一定不能丢(也就是不能给p另外赋值)。因为p一旦丢失,这段malloc申请来的内存就永远的丢失了(内存泄漏),直到当前程序结束时操作系统才会回收这段内存。

单片机程序跑飞是什么意思?

答:"单片机程序跑飞"是指由于某些异常情况,使得单片机的程序执行流程脱离预设的正常路径,导致系统运行不正常。这种现象可能有多种表现,例如:单片机系统不停地重启,无法进入正常工作状态。

一个常见的原因是数组越界(数组溢出),即函数中定义的数组元素的个数小于程序中实际使用的数组元素的个数。另一个可能的原因是外部干扰,比如电磁干扰等,这可能导致程序计数器PC的值发生非预期的变化,从而使程序的流向指向不确定区域。

描述一下C语言从代码到可执行程序的过程

答:一个C语言程序,从代码到可执行程序的过程需要四个步骤:预处理,编译 ,汇编,链接。

1.预处理
预处理负责对源代码进行文本处理。主要处理代码中以字符#开头的命令。
2. 编译
编译期间也要经过多个步骤,由.i的文本文件生成.s的文本文件。此文件为以汇编语句完成的代码
3.汇编
经过汇编阶段把汇编语句转换为机器指令,由.s的文本文件生成.o的二进制文件。
4.链接
链接器将所有二进制的目标文件和系统组件组合成一个可执行文件(.exe)。 (需要注意的是,我们在编译器是针对源文件进行编译的并且每个源文件都只会编译一次,所以汇编结束后每个源文件都会生成一个.o文件,这里的目标文件就是这些.o文件。)

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

嵌小超

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

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

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

打赏作者

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

抵扣说明:

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

余额充值