嵌入式笔试面试刷题(day11)

2023-08-18 07:00:00


前言

本篇文章继续刷题。

一、字节流,数据报,报文

1.数据报(Datagram):数据报是一种独立的、特定大小的消息单元,在网络通信中作为传输的基本单位。每个数据报都是独立的,具有消息边界和完整性。它包含了必要的标识信息,如源地址、目标地址、报文长度等,并且可以根据不同的网络协议进行封装。数据报通常通过面向数据报的协议(如UDP)进行传输。

2.字节流(Byte Stream):字节流是一连串连续的字节数据流,在网络通信中作为传输的基本单位。字节流没有消息的边界和结构概念,它被视为连续的字节序列进行传输。字节流通常通过面向字节流的协议(如TCP)进行传输。在字节流传输中,数据被分割成较小的数据段(数据包)进行传输,接收方需要根据应用协议对字节流进行解析和处理,以还原原始的数据格式和含义。

3.报文(Message):报文是在网络通信中传输的具有结构和语义的数据单元。报文由报头和报体组成,报头包含了元数据信息,报体包含了应用层的具体数据内容。报文的结构可以是预定义的、固定的,或者根据应用程序需要动态确定。报文可以通过数据报或字节流进行传输,具体取决于所选择的网络协议和传输方式。

主要区别如下:

1.数据报是独立的、具有消息边界和完整性;字节流是连续的、没有明确消息边界的字节序列。

2.数据报通过面向数据报的协议(如UDP)进行传输;字节流通过面向字节流的协议(如TCP)进行传输。

3.报文是具有结构和语义的数据单元,可以以数据报或字节流的形式进行传输。

二、makefile怎么引入库和模块

引入库:

在Makefile中添加库的链接指令:在Makefile文件中的目标依赖规则中,使用-l参数指定库的名称,例如-lmylib,其中mylib是要引入的库的名称。
指定库的搜索路径:如果库文件不在默认的搜索路径中(如/usr/lib),可以使用-L参数指定库文件的路径,例如-L/path/to/mylib,其中/path/to/mylib是库文件的路径。

引入模块/头文件:

在源文件中使用#include指令引入头文件:在需要使用某个模块的源文件中,使用#include指令将对应的模块的头文件包含进来,以便在源文件中使用其中定义的函数、变量等。

三、多次free一块内存空间会怎么样

1.未定义行为(Undefined Behavior):根据C和C++的语言标准,对同一块内存空间进行多次释放操作是未定义行为。这意味着编译器、运行时系统或操作系统可以以任意的方式处理这种情况,包括崩溃、程序异常终止、数据损坏等。

2.可能引发内存错误:多次释放同一块内存可能导致内存错误。当第一次释放后,该内存空间被标记为不可用,再次释放时系统可能无法正确管理该内存,可能会引发内存访问错误或者损坏其他数据结构。

3.内存泄漏:多次释放同一块内存可能导致内存泄漏。在第一次释放后,如果没有显式地将指针设置为NULL或重新分配其他内存,则无法再次使用该指针来分配内存或者判断该内存是否已经被释放,从而造成内存泄漏。

4.程序异常或崩溃:重复释放同一块内存可能导致程序异常或崩溃。这是因为操作系统或运行时系统可能会在发现无效释放操作时终止程序的执行,以保护系统和其他进程不受到影响。

代码测试:

#include <stdio.h>
#include <malloc.h>


int main(void)
{
    int* p = (int*)malloc(20);

    free(p);
    free(p);

    return 0;
}


运行结果:
在这里插入图片描述
这里可以发现会导致程序直接出现异常崩溃。

四、字符操作函数越界会发生什么

1.缓冲区溢出:越界访问可能导致缓冲区溢出。例如,strcpy函数会将源字符串的内容复制到目标字符串缓冲区,如果源字符串的长度超过目标缓冲区的大小,就会发生缓冲区溢出,导致目标缓冲区以及相邻内存区域被覆写。

2.内存损坏:越界访问可能导致内存损坏。如果访问超过分配给目标缓冲区的内存范围,可能会修改那些不属于目标缓冲区的内存单元。这可能会破坏其他变量、数据结构或者函数指针,导致程序运行异常或崩溃。

3.安全漏洞:越界访问可能引发安全漏洞,例如缓冲区溢出攻击。恶意用户可以利用越界访问来覆盖程序的控制流,从而实现远程代码执行、拒绝服务等攻击。

为避免这些问题,应该始终确保字符操作函数的输入参数符合预期,遵循正确的使用方式:

1.确保目标缓冲区足够大,能够容纳源字符串的全部内容,并考虑字符串结束标志符(‘\0’)的大小。

2.使用安全版本的字符操作函数,如strncpy代替strcpy,它可以指定复制的最大长度,避免超出目标缓冲区范围。

3.仔细检查输入参数的有效性,确保源字符串和目标缓冲区的长度符合预期,避免潜在的越界访问。

测试代码:

#include <stdio.h>
#include <string.h>


int main(void)
{
    char str[5];

    strcpy(str, "Hello World");
    

    return 0;
}


运行效果:
在这里插入图片描述

五、QT中一个信号可以连接多个槽函数吗

Qt中一个信号可以连接多个槽函数。在Qt中,使用信号(Signal)和槽(Slot)机制来实现对象间的通信。一个信号可以连接到多个槽函数,当信号被触发时,所有连接的槽函数都会被调用。

可以使用QObject::connect()函数将信号和槽函数连接起来。connect()函数接受两个参数:发送信号的对象和接收信号的对象。可以使用该函数来连接一个信号到一个槽函数,或者连接一个信号到多个槽函数。

以下是一个连接单个信号到多个槽函数的示例:

QObject::connect(sender, &Sender::mySignal, receiver1, &Receiver1::mySlot);
QObject::connect(sender, &Sender::mySignal, receiver2, &Receiver2::mySlot);

在上述示例中,Sender对象的mySignal信号被连接到两个不同的接收者对象(receiver1和receiver2)的槽函数(Receiver1::mySlot和Receiver2::mySlot)。当Sender对象触发mySignal信号时,两个槽函数都会被调用。

通过连接一个信号到多个槽函数,可以实现更灵活的信号处理和对象间的通信。这种方式经常用于实现观察者模式或处理同一事件的多个不同逻辑。

六、QT中一个槽函数可以对应多个信号吗

在Qt中一个槽函数可以对应多个信号。Qt的槽函数是普通的成员函数,可以被多个信号连接到同一个槽函数上。

使用QObject::connect()函数可以将多个信号连接到同一个槽函数上。以下是一个示例:

QObject::connect(sender1, &Sender1::mySignal, receiver, &Receiver::mySlot);
QObject::connect(sender2, &Sender2::anotherSignal, receiver, &Receiver::mySlot);

在上述示例中,Receiver对象的mySlot槽函数被连接到两个不同的发送者对象(sender1和sender2)的信号(mySignal和anotherSignal)。当任何一个发送者对象触发其对应的信号时,都会触发Receiver对象的mySlot槽函数。

这种方式可以用于实现对相似的事件或信号进行相同的响应逻辑,将多个信号连接到同一个槽函数使得代码更加简洁和可维护。

需要注意的是,当一个槽函数连接到多个信号时,如果信号的参数类型不同,或者信号的参数顺序不同,需要确保槽函数能够正确处理这些参数,否则可能导致运行时错误或逻辑问题。

总结

本篇文章就讲解到这里。

更多推荐

第八章 排序

一、插入排序不带哨兵voidInsertSort(intA[],intn){inti,j,temp;for(i=1;i<n;i++){if(A[i]<A[i-1]){temp=A[i];for(j=i-1;j>=0&&A[j]>temp;--j){A[j+1]=A[j];}A[j+1]=temp;}}}带哨兵voidI

二分与前缀和

目录🍈前言❤二分🌹二分🌼数的范围🌼数的三次方根🌼特殊数字🌼机器人跳跃问题🌼四平方和🌼分巧克力🌹前缀和🌼前缀和🌼子矩阵的和🌼激光炸弹🌼K倍区间🍈前言❤二分整数二分模板中,一个比较坑的点,就是C++整数向下取整的机制,考虑到这点,你才能写出AC100%的代码关键在于1,对if()后面条件的判断2

SAP CRM 模块:概述,体系结构

前言CRM代表“客户关系管理”,是一组有助于以有组织的方式管理客户关系的方法和工具。在当今竞争激烈的商业环境中,顶级公司的注意力越来越集中于其最有价值的资产–客户。因此,这些公司需要一种合适的软件解决方案来迎合其客户,该解决方案易于使用,易于定制,完全集成并且可以灵活实施。客户关系管理是一种用于优化客户互动的业务策略。

MD5加密算法

1、简介MD5在90年代初由MIT的计算机科学实验室和RSADataSecurityInc发明,经MD2、MD3和MD4发展而来。MD5将任意长度的“字节串”变换成一个128bit的大整数,并且它是一个不可逆的字符串变换算法,换句话说就是,即使你看到源程序和算法描述,也无法将一个MD5的值变换回原始的字符串,从数学原理

编程小白如何学习RPA,0基础学习RPA攻略!

对于编程小白来说,学习RPA(机器人流程自动化)可能会感到有些无从下手。然而,只要按照一定的步骤和策略进行学习,从0开始掌握RPA并非难事。一、了解RPA的基本概念和优势在开始学习RPA之前,首先需要了解RPA的基本概念、特点和优势。RPA是一种使用自动化工具模拟人类在计算机上执行操作的技术,它可以帮助企业实现重复性、

第36章_瑞萨MCU零基础入门系列教程之步进电机控制实验

本教程基于韦东山百问网出的DShanMCU-RA6M5开发板进行编写,需要的同学可以在这里获取:https://item.taobao.com/item.htm?id=728461040949配套资料获取:https://renesas-docs.100ask.net瑞萨MCU零基础入门系列教程汇总:https://b

Spring Boot 简介与入门

🌷🍁博主猫头虎带您GotoNewWorld.✨🍁🦄博客首页——猫头虎的博客🎐🐳《面试题大全专栏》文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺🌊《IDEA开发秘籍专栏》学会IDEA常用操作,工作效率翻倍~💐🌊《100天精通Golang(基础入门篇)》学会Golang语言,畅玩云原生,走遍大

数据结构:树和二叉树之-堆排列 (万字详解)

目录树概念及结构1.1树的概念1.2树的表示​编辑2.二叉树概念及结构2.1概念2.2数据结构中的二叉树:​编辑2.3特殊的二叉树:​编辑2.4二叉树的存储结构2.4.1顺序存储:2.4.2链式存储:二叉树的实现及大小堆排列1功能展示2定义基本结构3初始化4打印5销毁6插入7向上调整8交换两数组元素之间的值9删除10向

Kubernetes(K8S)集群部署

目录一、创建3台虚拟机二、为每台虚拟机安装Docker三、安装kubelet3.1安装要求3.2为每台服务器完成前置设置3.3为每台服务器安装kubelet、kubeadm、kubectl四、使用kubeadm引导集群4.1master服务器4.2node1、node2服务器4.3初始化主节点4.4work节点加入集群

【C语言趣味教程】(1) 深入浅出 HelloWorld:通过 HelloWorld 展开教学 | 头文件详解 | main 函数详解

🔗《C语言趣味教程》👈猛戳订阅!!!💭写在前面:这是一套C语言趣味教学专栏,目前正在火热连载中,欢迎猛戳订阅!本专栏保证篇篇精品,继续保持本人一贯的幽默式写作风格,当然,在有趣的同时也同样会保证文章的质量,旨在能够产出"有趣的干货"!本系列教程不管是零基础还是有基础的读者都可以阅读,可以先看看目录!标题前带星号(

第二证券:什么是a股b股?

在我国的股市中,我们经常会听到“A股”和“B股”这两个名词。那么,终究什么是A股和B股呢?首先,A股全称为“A股票”,是指在我国境内上市的以人民币计价的股票。A股首要面向国内出资者,只要具有必定条件的内地居民和安排出资者才可出资A股。此外,A股还分为两种:人民币A股和港币A股。前者是在我国境内发行的A股,后者则是在香港

热文推荐