C语言常见面经详细总结

1、递归函数定义没有问题,递归深层次后易引发什么问题?

(1)影响执行效率

(2)栈溢出。

因为每一次调用函数是,栈区都要给函数分配空间,而且上一次调用并没有结束,调用的次数太多,栈区的内存不够分配了,便会出现栈溢出的情况。

2、堆与栈的区别?

(1)栈的空间是系统自动分配和回收,堆的空间是用户手动分配回收(malloc,calloc,realloc,free)

(2)栈的空间较小,堆的空间较大

(3)栈的地址空间往地址向下增长,堆的地址空间是由低地址到高地址

(4)栈的存储效率更高

3、循环控制条件关键字goto被经常使用,但是goto的使用场合为什么受到局限?

因为goto会破坏程序的栈逻辑。

4、循环控制条件关键字goto的使用场景有哪些?

(1)常用来跳出死循坏;

(2)打印错误;

(3)goto被经常使用,只是使用场合受到局限,因为他会破坏程序的栈逻辑。

5、字节对齐的理解

5.1 什么是字节对齐?

字节对齐主要是针对结构体而言的,通常编译器会自动对其成员变量进行对齐,以提高数据存取的效率;

5.2 字节对齐的两种方式

默认对齐方式、指定对齐方式;

(1)默认对齐方式内存分配满足以下三个条件:

        1.结构体第一个成员的地址和结构体的首地址相同;

        2.结构体每个成员地址相对于结构体首地址的偏移量(offset)是该成员大小的整数倍,如果不是则编译器会在成员之间添加填充字节;

        3.结构体总的大小要是其成员中最大size的整数倍,如果不是编译器会在其末尾添加填充字节。

        如char是1字节,short是2字节,int是4字节...

(2)指定对齐方式使用以下方式声明:

//注:通过#pragma pack(n)改变C编译器的字节对齐方式

#pragma pack(4)         //安装4字节的对齐方式

指定对齐方式内存分配满足以下几个条件:

        1.结构体第一个成员的地址和结构体的首地址相同

        2.结构体每个成员的地址偏移需要满足:N大于等于该成员的大小,那么该成员的地址偏移需满足默认对齐方式(地址偏移是其成员大小的整数倍);N小于该成员的大小,那么该成员的地址偏移是N的整数倍。

        3.结构体总的大小需要时N的整数倍,如果不是需要在结构体的末尾进行填充。

        4.如果N大于结构体成员中最大成员的大小,则N不起作用,仍然按照默认方式对齐。

        注:在使用#pragma pack设定对齐方式一定要是2的整数幂,也就是(1,2,4,8,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)int *const p;限制指针变量修饰:指针变量指向的位置不能被修改。定义时,被 const 修饰的指针变量指针只能在定义时初始化,不能定义之后重新指向新的数据。

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

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

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

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

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

图 虚拟空间的各个部分

10、volatile关键字的作用?

防止编译时被编译器优化(例如在流水灯等场景下需要写一个函数来延时 常规情况启用-O3级别优化 这个延时函数会被优化 但是加上volatile 就不会被优化)

多用于中断函数与多线程中

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

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

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

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

定义 功能 参数 生效阶段

(1)sizeof是运算符,计算数据类型占内存的大小,参数可以是数组、指针、类型、对象、函数等;sizeof在编译时就计算出了sizeof的结果

(2)strlen是函数,功能是返回字符串的长度,参数必须是字符型指针(char*)。strlen函数必须在运行时才能计算出来。

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、预处理的作用是什么?

1.展开头文件2.宏替换3.去掉注释行

18、编译器的作用?

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

19、.ELF文件是什么?

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

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

图 编译过程

(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++类的成员定义;

(2)由于结构体只能定义变量,不能够定义函数,所以通过函数指针的方法来实现其类函数的定义。

22.获取输入

Scanf

23. 指针常见含义:

1.*p的含义: 根据p里面的地址,找对应类型的内存块。

2.p+n的含义:• p地址向后偏移n个存储单元,得到一个新地址(在一连续空间中俩个指针相减等于间隔的内存空间个数)

3.p[n]的含义:• 表示p地址第n+1个内存块

4.指针支持的运算 算术运算、自增自减、关系运算、逻辑运算、赋值运算、条件运算(三目)、逗号运算、sizeof关键字、& *

24.大小端

大端模式:是指数据的高字节保存在内存的低地址中;
小端模式:是指数据的高字节保存在内存的高地址中;

25. strcpy和memcpy区别

1.复制的内容不同。

strcpy只能复制字符串,

memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。

2.复制的方法不同。

strcpy不需要指定长度,它遇到被复制字符的串结束符"\0"才结束,如果空间不够,就会引起踩内存。

memcpy则是根据其第3个参数决定复制的长度。

3.用途不同。

通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy,由于字符串是以“\0”结尾的,所以对于在数据中包含“\0”的数据只能用memcpy。

26. 三个变量

等号左边必须是变量
自增自减必须是变量
形参必须是变量

27.字节对齐规则

• 结构体各成员的起始位置相对于结构体变量的起始位置的偏移量,应该为该结构体成员类型所占字节数与pack(n)的n取最小值的倍数
• 结构体变量所占字节数应该是结构体各成员所占字节数的最大值与pack(n)的n取最小值

28.extern与static区别

1.static  控制变量的存储方式和可见性

作用于局部变量时:叫静态局部变量,在函数调用时,只有在该函数第一次调用时才对其分配空间和初始化。在函数调用结束时,不对该变量的内存进行释放,值仍然保留。这也是于自动变量的区别。

作用于全局变量时:叫静态全局变量。表示该变量是私有的,只能在该文件使用。不能通过extern关键字对其引用。

作用于函数时:叫静态函数,表示该函数是私有的,只能在本文件中使用,不能通过extern关键字对其引用

2.extern :用在变量或者函数之前来声明此变量/函数是在别处定义的,要在此处引用

本文件:定义在本文件下面的全局变量,想要在上面使用时需要使用extern关键字对其声明

其他文件:定义在其他文件的全局变量想要在本文件使用时,若该变量未被static修饰时可通过extern关键字在本文件对其声明。即可使用

在C++中调用C库函数 需要在C++程序中用extern”C”声明要引用的函数

29.断言

assert(src != NULL);//断言 括号内部成立上面事情不发生,否则报错

头文件:#include<assert.h>

作用: 解决预防性编程的问题,例如参数传入一个指针为NULL时,程序就会奔溃时,我们可以增加assert来防御这种问题。

在我们联调中assert会显示崩溃的信息,加快联调速度,也能对参数问题进行判断。assert只能在debug版起作用,发布版不生效。

综上所述: assert就是预防性编程一个重要的宏,能加快联调速度。

30.const和define区别

31.静态链接和动态链接有什么区别?

31.1静态链接

静态链接是在编译链接时直接将需要的执行代码拷贝到调⽤用处;

优点: 在于程序在发布时不需要依赖库,可以独立执行,

缺点: 在于程序的体积会相对较大,⽽而且如果静态库更更新之后,所有可执行文件需要重新链接;

31.2动态链接

动态链接是在编译时不直接拷贝执行代码,而是通过记录一系列符号和参数,在程序运⾏行行或加载时将这些信息传递给操作系统,操作系统负责将需要的动态库加载到内存中,然后程序在运行行到指定代码时,在共享执行内存中寻找已经加载的动态库可执⾏代码,实现运行时链接;

优点:在于多个程序可以共享同一个动态库,节省资源;

缺点:在于由于运行时加载,可能影响程序的前期执行性能

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/121589.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

挑战100天 AI In LeetCode Day07(热题+面试经典150题)

挑战100天 AI In LeetCode Day07&#xff08;热题面试经典150题&#xff09; 一、LeetCode介绍二、LeetCode 热题 HOT 100-92.1 题目2.2 题解 三、面试经典 150 题-93.1 题目3.2 题解 一、LeetCode介绍 LeetCode是一个在线编程网站&#xff0c;提供各种算法和数据结构的题目&am…

2023年下半年架构案例真题及答案

案例的考点&#xff1a; 大数据架构 Lambda架构和Kappa架构 jwt特点 数据持久层&#xff0c;Redis数据丢失&#xff0c;数据库读写分离方案 Hibernat架构 SysML七个关系&#xff0c;填需求图 大数据的必选题&#xff1a; 某网作为某电视台在互联网上的大型门户入口&#…

Python高级语法----深入理解Python协程

文章目录 什么是协程?Python中的协程基本示例协程和事件循环总结Python协程是一种非常强大的并发编程概念,让你能够高效地处理多任务。协程在Python中的使用已经变得越来越流行,特别是在异步编程中。本文将用通俗易懂的语言来介绍协程的概念,并提供实际的代码示例和执行结果…

‘vite‘ is not recognized as an internal or external command

标题翻译后就是&#xff1a;‘vite‘ 不是内部或外部命令&#xff0c;也不是可运行的程序 或批处理文 运行一个由 Vite 构建的 Vue3 项目&#xff0c;之前还好好的能正常跑&#xff0c; 但拉取新代码之后再次执行 npm run dev 就提示 ‘vite’ 不是内部或外部命令&#xff0…

粤嵌实训医疗项目(小组开发)--day05

目录 一、医生功能模块 ------------前端实现------------ ------------后端接口------------ 功能一&#xff1a;分页查询医生基础信息&#xff08;介绍MybatisPlus如何使用分页&#xff09; 功能二&#xff1a;根据搜索栏名称查找对应医生&#xff08;讲解自定义查询集&…

UE5 新特性 Nanite 开启

啥也不说&#xff0c;只能说&#xff0c;真的牛&#xff0c;在自己的项目上&#xff0c;从10几20的帧数&#xff0c;直接彪到了70 适用场景&#xff1a; 大场景&#xff0c;三角面足够多 在Project Setting里面 将这几个勾未true 勾上这个&#xff0c;放入场景即可

2023年【A特种设备相关管理(锅炉压力容器压力管道)】考试内容及A特种设备相关管理(锅炉压力容器压力管道)考试技巧

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 A特种设备相关管理&#xff08;锅炉压力容器压力管道&#xff09;考试内容根据新A特种设备相关管理&#xff08;锅炉压力容器压力管道&#xff09;考试大纲要求&#xff0c;安全生产模拟考试一点通将A特种设备相关管理…

arthas常用命令

arthas常用命令 IDEA插件 arthas idea退出arthasjad 反编译watch 方法执行数据观测tracemonitor https://arthas.aliyun.com/doc/ IDEA插件 arthas idea 退出arthas # quit或者exit命令,只是退出当前的连接, Attach到目标进程上的arthas还会继续运行&#xff0c;端口会保持开…

Win10专业版安装wsl-ubuntu子系统

文章目录 一、查看是否满足安装要求二、管理员权限启动 Windows PowerShell三、启用Windows10子系统功能四、启用虚拟机平台功能五、重启电脑六、下载 Linux 内核更新包&#xff08;适用于 x64 计算机的 WSL2 Linux 内核更新包&#xff09;七、将 WSL 2 设置为默认版本八、打开…

Linux--vim

文章目录 Vim的介绍Vim的几种模式命令模式下的基本操作批量化注释Vim的简单配置使用插件 Vim的介绍 Vim是一个强大的文本编辑器&#xff0c;是从vi编辑器发展而来的&#xff0c;在vi编辑器的基础上进行了改进和拓展&#xff0c;具有强大的特性和功能。 Vim是一个自由开源软件&…

C# OpenCvSharp 环形文字处理 直角坐标与极坐标转换

效果1 效果2 项目 代码 using OpenCvSharp; using System; using System.Drawing; using System.Text; using System.Windows.Forms;namespace OpenCvSharp_Demo {public partial class frmMain : Form{public frmMain(){InitializeComponent();}string fileFilter "*.*…

基于SSM的电脑公司财务管理系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

高防CDN与高防服务器:为什么高防服务器不能完全代替高防CDN

在当今的数字化时代&#xff0c;网络安全已经成为企业不容忽视的关键问题。面对不断增长的网络威胁和攻击&#xff0c;许多企业采取了高防措施以保护其网络和在线资产。然而&#xff0c;高防服务器和高防CDN是两种不同的安全解决方案&#xff0c;各自有其优势和局限性。在本文中…

概念解析 | 雷达协同认知成像:原理、研究现状与挑战

注1:本文系“概念解析”系列之一,致力于简洁清晰地解释、辨析复杂而专业的概念。本次辨析的概念是:雷达协同认知成像。 概念解析 | 雷达协同认知成像:原理、研究现状与挑战 摘要: 雷达协同认知成像,作为一种先进的感知技术,在军事侦察、民用航空、无人驾驶等领域具有广…

绝缘监测及故障定位产品在IT系统中的应用

绝缘监测及故障定位产品在IT系统中的应用--安科瑞 崔丽洁 医疗2类场所应用场景 功能 1.将TN-S系统转接成IT配电系统&#xff0c;并通过IT系统向医疗2类场所供电&#xff1b; 2.实时IT系统对地绝缘电阻、隔离变压器负荷及其温度状态&#xff0c;并在故障时发出声光报警信号&…

案例-注册页面(css)

html页面用css控制样式&#xff0c;画一个注册页面。 页面最终效果如下&#xff1a; 页面代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>注册页面</title> <style>*{…

【分布式事务】初步探索分布式事务的概率和理论,初识分布式事的解决方案 Seata,TC 服务的部署以及微服务集成 Seata

文章目录 一、分布式服务案例1.1 分布式服务 demo1.2 演示分布式事务问题 二、分布式事务的概念和理论2.1 什么是分布式事务2.2 CAP 定理2.3 BASE 理论2.4 分布式事务模型 三、分布式事务解决方案 —— Seata3.1 什么是 Seata3.2 Seata 的架构3.3 Seata 的四种分布式事务解决方…

JavaEE-博客系统3(功能设计)

本部分内容为&#xff1a;实现登录功能&#xff1b;强制要求用户登录&#xff1b;实现显示用户信息&#xff1b;退出登录&#xff1b;发布博客 该部分的后端代码如下&#xff1a; Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws Ser…

信息系统项目管理师第四版:第5章 信息系统工程

请点击↑关注、收藏&#xff0c;本博客免费为你获取精彩知识分享&#xff01;有惊喜哟&#xff01;&#xff01; 信息系统工程是用系统工程的原理、方法来指导信息系统建设与管理的一门工程技术学科&#xff0c;它是信息科学、管理科学、系统科学、计算机科学与通信技术相结合…

Visual Interpretability for Deep Learning: a Survey

Visual Interpretability for Deep Learning: a Survey----《深度学习的视觉可解释性:综述》 摘要 本文回顾了最近在理解神经网络表示以及学习具有可解释性/解耦的中间层表示的神经网络方面的研究。尽管深度神经网络在各种任务中表现出了优越的性能&#xff0c;但可解释性始终…