单片机岗位常见面试问题——C语言(3)

一、栈在C语言中的作用

(1)C语言中栈用来存储临时变量,临时变量包括函数参数和函数内部定义的临时变量。函数调用中和函数调用相关的函数返回地址,函数中的临时变量,寄存器等均保存在栈中,函数调用返回后从栈中恢复寄存器和临时变量等函数运行场景。

(2)多线程编程的基础是栈,栈是多线程编程的基石,每一个线程都最少有一个自己专属的栈,用来存储本线程运行时各个函数的临时变量和维系函数调用和函数返回时的函数调用关系和函数运行场景。 操作系统最基本的功能是支持多线程编程,支持中断和异常处理,每个线程都有专属的栈,中断和异常处理也具有专属的栈。

二、C语言函数参数压栈顺序

C语言函数参数采用自右向左的入栈顺序,主要原因是为了支持可变长参数形式

void fun(int a, int b);

fun(1, 2); // 调用函数时,入栈顺序为参数从右往左,从而取参数时从左往右

| 1 |

| 2 |

三、# include< filename. h>和#include" filename. h"区别

对于 include< filename. h>,编译器先从标准库路径开始搜索filename.h,使得系统文件调用较快。而 对于# include“ filename.h”,编译器先从用户的工作路径开始搜索filename.h,然后去寻找系统路径,使得自定义文件较快。

四、头文件的作用

头文件的作用主要表现为以下两个方面

1. 通过头文件来调用库功能。出于对源代码保密的考虑,源代码不便(或不准)向用户公布,只要向用户提供头文件和二进制的库即可。用户只需要按照头文件中的接口声明来调用库功能,而不必关心接口是怎么实现的,编译器会从库中提取相应的代码。

2. 头文件能加强类型安全检查。当某个接口被实现或被使用时,其方式与头文件中的声明不一致,编译器就会指出错误,大大减轻程序员调试、改错的负担。

五、在头文件中定义静态变量是否可行,为什么?

不可行,如果在头文件中定义静态变量,会造成资源浪费的问题,同时也可能引起程序错误。因为如果 在使用了该头文件的每个C语言文件中定义静态变量,按照编译的步骤,在每个头文件中都会单独存在一个静态变量,从而会引起空间浪费或者程序错误所以,不推荐在头文件中定义任何变量,当然也包括静态变量。

六、strlen("\0") =? sizeof("\0")=? 两者结果与区别

strlen("\0") =0,sizeof("\0")=2。"\0" 实际上是 {'\0', '\0'}

strlen用来计算字符串的长度(在C/C++中,字符串是以"\0"作为结束符的),它从内存的某个位置(可以是字符串开头,中间某个位置)开始扫描直到碰到第一个字符串结束符\0为止,然后返回计数器值sizeof是C语言的关键字,它以字节的形式给出了其操作数的存储大小,操作数可以是一个表达式或括在括号内的类型名,操作数的存储大小由操作数的类型决定。

七、C语言中 struct与 union的区别

struct(结构体)与 union(联合体)是C语言中两种不同的数据结构。

a)结构体与联合体虽然都是由多个不同的数据类型成员组成的,但不同之处在于联合体中所有成员共 用一块地址空间,即联合体只存放了一个被选中的成员,而结构体中所有成员占用空间是累加的, 其所有成员都存在,不同成员会存放在不同的地址。在计算一个结构型变量的总长度时,其内存空 间大小等于所有成员长度之和(需要考虑字节对齐),而在联合体中,所有成员不能同时占用内存空间,它们不能同时存在,所以一个联合型变量的长度等于其最长的成员的长度

(b)对于联合体的不同成员赋值,将会对它的其他成员重写,原来成员的值就不存在了,而对结构体的 不同成员赋值是互不影响的

八、大小端

大端:低字节存放在高地址,高字节存放在低地址(符合阅读习惯)小端:低地址存低字节,高地址存高字节

如何判断一个机器是大端还是小端

定义一个两个字节的变量(0x1234),打印输出一个字节,如果输出的是0x12,大端,如果是0x34,小端。

#通信硬件知识分享#

单片机岗位必备八股知识 文章被收录于专栏

包括c语言常见知识和语法,数据结构,通信协议,STM32,计算机体系结构和硬件,freertos等等

全部评论

相关推荐

评论
点赞
收藏
分享
牛客网
牛客企业服务