C/C++ 面试题解析:函数指针、内存泄露、对象访问、内存分布等
-
函数指针变量是指可以存储函数地址的变量,可以通过函数指针变量来调用函数。指针函数是指返回类型为指针的函数,可以返回指针类型的值。
-
内存泄露是指程序在分配内存后,没有正确释放内存造成的一种现象。内存泄露通常是由于程序中存在未释放的动态分配内存或者存在内存引用计数错误导致的。为了预防内存泄露,可以在分配内存后及时释放内存,避免不必要的动态内存分配,正确管理内存的生命周期。
-
在没有继承的情况下,可以通过友元函数来实现对象B间接访问对象A的私有成员。将对象B的声明放在对象A的类定义中,并将对象B的函数声明为对象A的友元函数,这样对象B就可以访问对象A的私有成员。
-
C语言程序内存分布主要包括代码段、数据段、堆和栈。代码段用于存放程序的指令代码,数据段用于存放全局变量和静态变量,堆用于动态分配内存,栈用于存放函数调用时的局部变量和函数调用的上下文信息。
-
关键字volatile在C语言中的作用是告诉编译器该变量可能会被意外修改,编译器在对该变量进行优化时会避免一些不必要的优化。一个参数可以同时被const和volatile修饰,const表示该参数的值不会被修改,volatile表示该参数可能会被意外修改。
-
前置++和后置++的效率没有明显差别。编译器会将前置++和后置++的代码转化为相应的汇编指令,生成的机器码是一样的。
-
进程的状态包括运行状态、就绪状态、阻塞状态和终止状态。进程的切换是由操作系统内核进行调度实现的,根据进程的优先级、时间片轮转等算法进行切换。
-
系统IO是指直接使用操作系统提供的系统调用进行输入输出操作,而标准IO是在系统IO的基础上进行了封装,提供了更加方便的接口和函数,使用标准IO可以通过stdio库来进行输入输出操作。
-
全局变量和局部变量在内存中的区别是,全局变量存储在静态存储区,局部变量存储在栈中。全局变量在程序开始时就分配内存,在程序结束时才释放内存,而局部变量在函数调用时分配内存,在函数返回时释放内存。
-
大端存储和小端存储是指在多字节数据类型的存储方式上的区别。大端存储是指高字节存储在低地址,小端存储是指低字节存储在低地址。
-
函数和宏的区别主要有以下几点:函数是通过调用来执行的,而宏是在预处理阶段进行替换的;函数可以有返回值,而宏没有返回值;函数可以进行类型检查,而宏不会进行类型检查;函数可以被调试,而宏无法被调试。
-
在C++程序中调用被C编译器编译后的函数,需要加extern 'C'声明是为了告诉C++编译器按照C的方式来处理函数名,因为C++编译器会对函数名进行修饰。
-
面向对象程序设计方法的核心特点是封装、继承和多态。封装是指将数据和相关的操作封装在一起,对外部隐藏内部实现细节;继承是指通过定义新的类来继承已有类的属性和方法;多态是指同一个方法可以根据不同的对象产生不同的行为。
-
ifndef/define/endif是头文件中的条件编译指令,用于防止头文件的重复包含。通过ifndef判断宏是否已经定义,如果没有定义则继续编译后面的代码,然后定义宏,直到endif结束。
-
宏是在预处理阶段进行替换的,不进行类型检查,而inline内联函数是在编译阶段进行替换的,进行类型检查。宏的替换是文本替换,可能会导致代码膨胀,而内联函数的替换是函数调用的替换,不会导致代码膨胀。
-
使用bind等函数写出TCP client和TCP server的建立连接的流程可以参考以下步骤:
- TCP server:创建socket -> 绑定地址和端口 -> 监听连接请求 -> 接受连接 -> 通信
- TCP client:创建socket -> 连接服务器 -> 通信
-
看门狗是一种硬件设备或软件机制,用于监控系统的运行状态。当系统出现故障或停止响应时,看门狗会自动重启系统,确保系统的稳定运行。
-
SPI总线是一种串行外设接口,通过四根线实现数据传输,包括一个时钟线、一个主从选择线、一个数据线和一个片选线。I2C总线是一种串行双向通信总线,通过两根线实现数据传输,包括一个时钟线和一个数据线。
-
嵌入式Linux启动步骤主要包括以下几个步骤:
- 加电启动,执行硬件初始化。
- 加载引导程序,引导程序负责加载内核镜像到内存中。
- 启动内核,内核初始化系统并启动用户空间。
- 用户空间初始化,执行init进程,启动系统其他进程和服务。
- 用户程序执行,用户程序运行在用户空间,完成各种应用功能。
原文地址: https://www.cveoy.top/t/topic/jzoz 著作权归作者所有。请勿转载和采集!