【嵌入式面试】2024年嵌入式经典面试题汇总(C语言)_嵌入式面试题 c语言

int a;      //4
double b;   //8

};

int main()
{
printf("s1的大小:%ld\n ",sizeof(struct s1));
printf("s2的大小:%ld\n ",sizeof(struct s2));

return 0;

}



> 
> 结果:
>   
> 
> s1的大小:14
>   
> 
> s2的大小:13
> 


例2:结构体使用默认字节对齐方式,m值



// date:2022年 11月 08日 星期二 19:35:36 CST
// author: HeiBaiYe
// path: /mnt/hgfs/CD2206/02-c语言
#include <stdio.h>
struct s1{
char ch; // 1
int a; //4
double b; //8
char c1; //1
};

struct s2{
char ch; //1
int a; //4
double b; //8
};

int main()
{
printf("s1的大小:%ld\n ",sizeof(struct s1));
printf("s2的大小:%ld\n ",sizeof(struct s2));

return 0;

}



> 
> 结果:
>   
> 
> s1的大小:24
>   
> 
> s1的大小:16 
> 





## 6、局部变量和全局变量可以重名吗?


(1)能,局部变量会屏蔽全局变量。C++中要用全局变量,需要使用 "::"(域解析符) 。C语言中局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。


(2)对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体内。 


## 7、UNIX系统中fsync函数的作用?


 fsync()负责将参数fd 所指的文件数据, 由系统缓冲区写回磁盘, 以确保数据同步。


 头文件:#include 


 定义函数:int fsync(int fd);


 函数说明:fsync()负责将参数fd 所指的文件数据, 由系统缓冲区写回磁盘, 以确保数据同步.


 返回值:成功则返回0, 失败返回-1, errno 为错误代码。





## 8、const关键字使用有哪些?


### 8.1 修饰变量


const的 常规用法,在变量初次定义时赋初,并用关键字const修饰,使变量只可访问,不能重新赋值修改变量。 


### 8.2 修饰指针


(1)限制指针变量修饰:指针变量指向的位置不能被修改。定义时,被 const 修饰的指针变量指针只能在定义时初始化,不能定义之后重新指向新的数据。 


(2)限制指针变量指向的数据修饰【指针的解引用】:修饰的指针变量指向的变量的值不能被修改,但是该指针可以指向其它空间。


(3)同时限制指针变量和指针变量指向的变量的值修饰:指针变量指向的位置不能被修改,并且指针变量指向变量的值也不能被修改。 


(4)修饰函数形参【指针】:函数形参可以利用const关键字进行限制,来防止在函数内部修改指针指向的数据。


## 9、内存布局中有哪些段?


文本段(.text)、数据段(.data)、.bss段、堆(heap)、栈(stack)





![](https://img-blog.csdnimg.cn/img_convert/06fe89c0b6bd4a538699b71751ca4a94.jpeg)



图 虚拟空间的各个部分 


## 10、volatile关键字的作用?


(1)裸机编程时,某变量是指向寄存器中某一特定地址,添加volatile的变量不进行优化处理;


(2)某函数与中断函数共享全局变量时,加上volatile,让编译器不要省略该变量的访问;


(3)多线程中修饰共享全局变量,让编译器不要省略该变量的访问。


## 11、sizeof()与strlen()的区别?


(1)sizeof是运算符,计算能容纳实现所建立的最大对象的字节大小,参数可以是数组、指针、类型、对象、函数等;


(2)strlen是函数,功能是返回字符串的长度,参数必须是字符型指针(char\*)。


## 12、内存泄漏和内存溢出是什么?


(1)内存溢出:指程序申请内存时,没有足够的内存供申请者使用。或者说,给了你一块存储int类型数据的存储空间,但是你却存储long类型的数据,那么结果就是内存不够用,此时就会报错Out Of Memory,即所谓的内存溢出。


(2)内存泄漏:是指程序在申请内存后,无法释放已申请的内存空间。一次内存泄漏似乎不会有大的影响,但内存泄漏堆积后的后果就是内存溢出。


## 13、定义一个指针赋值字符串与定义一个数组赋值字符串有什么区别?


(1)指针赋值字符串是指向一定内存的指针,只不过是指向字符串常量的指针,指针中的数据不能修改。


(2)数组赋值字符串是一片char型的数组,可以理解为缓冲区,只不过是赋值为了字符串。


## 14、malloc()与calloc分配空间有什么不一样?


(1)malloc申请后空间的值是随机的,并没有进行初始化;而calloc却在申请后,对空间逐一进行初始化,并设置值为0;


(2)malloc要申请的空间大小,需要我们手动的去计算;calloc并不需要人为的计算空间的大小。


## 15、实现循环的方式?


while、for 、do while 、goto 循环。


## 16、全局变量和局部变量在内存中有什么不同?


(1)全局变量保存在内存的全局存储区中,占用静态的存储单元;


(2)局部变量保存在栈中,只有在所在函数被调用时才动态地为变量分配存储单元。


## 17、预处理的作用是什么?


预处理器可以删除注释、包含其他文件以及执行宏(宏macro是一段重复文字的简短描写)替代。


## 18、编译器的作用?


编译器就是将一种语言(通常为高级语言)翻译为另一种语言(通常为低级语言)的程序。一个现代编译器的主要工作流程:源代码(.c)→ 预处理器(.i) → 编译器 (.s)→ 目标代码 (.o)→ 链接器 → 可执行程序 。


## 19、.ELF文件是什么?


.ELF是C语言在linux中的可执行文件。


## 20、C语言程序编译的流程是什么?





![](https://img-blog.csdnimg.cn/img_convert/a242006c07ca4e1c90c7f8e546219a8c.jpeg)



图 编译过程


(1)预处理:根据以字符#开头的命令修给原始的C程序,结果得到另一个C程序,通常以.i作为文件扩展名。主要是进行文本替换、宏展开、删除注释这类简单工作。


对应的命令:linux> gcc -E hello.c hello.i 


(2)编译:编译器将文本文件hello.i翻译成hello.s,包含相应的汇编语言程序。


 对应的命令:linux> gcc -S hello.c hello.s 


(3)汇编:将.s文件翻译成机器语言指令,把这些指令打包成一种叫做可重定位目标程序的格式,并将结果保存在目标文件.o中(把汇编语言翻译成机器语言的过程)。


把一个源程序翻译成目标程序的工作过程分为五个阶段:词法分析;语法分析;语义检查和中间代码生成;代码优化;目标代码生成。主要是进行词法分析和语法分析,又称为源程序分析,分析过程中发现有语法错误,给出提示信息。


对应的命令:linux> gcc -c hello.c hello.o


(4)链接:将静态库和动态库的库函数连接到可执行程序中。静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了。其后缀名一般为.a。动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。动态库一般后缀名为.so,gcc在编译时默认使用动态库。





## 21、如何用C语言实现C++的类?


(1)由于C语言是面向过程,而C++是面向对象,所以在定义数据时,可以用C的结构体成员充当C++类的成员定义;
## 最后

**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**

**深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。**

**因此收集整理了一份《2024年嵌入式&物联网开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**

![img](https://img-blog.csdnimg.cn/img_convert/90cdb0e9784333a07534bfe125c1dedc.png)

![img](https://img-blog.csdnimg.cn/img_convert/1f7b29b5a7d579508cf1a8f291eb9ef5.jpeg)

![img](https://img-blog.csdnimg.cn/img_convert/443f3921622fba47ae89ead95d7bd133.png)

 ![img](https://img-blog.csdnimg.cn/img_convert/d7a5740ed4a24ce49a575b56284c548b.png)

![img](https://img-blog.csdnimg.cn/img_convert/b00d6ba0fdea94080a66490856e16bd9.png)

![img](https://img-blog.csdnimg.cn/img_convert/6ed2ecbfe7d0dda8090fab296810b510.png)

![](https://img-blog.csdnimg.cn/img_convert/229dd143285512b32d56d2b7b896e2d0.png)

 

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!**

[**如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!**](https://bbs.csdn.net/topics/618654289)

**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**!!


38)]

[外链图片转存中...(img-COHQEeHd-1715627085339)]

 

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!**

[**如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!**](https://bbs.csdn.net/topics/618654289)

**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**!!


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值