1.申请释放内存空间:
    new(),delete():C语言标准库的内存管理函数,相比于malloc(),free()会进行内存检查;
    calloc()分配指定数量的对象,每个对象的大小由第二个参数指定;申请的空间会自动进行初始化为0;而malloc()和realloc()不会进行初始化,存储的是随机数
    realloc()调整之前分配的内存块的大小。
    分配的空间是否需要初始化?需要
2.tcp通信
    特点:面向连接,可靠传输,流量控制(接收方通过滑动窗口和ACK控制发送方发送数据的速度),拥塞控制(根据网络拥塞情况,减小发送窗口来降低网络拥塞程度),面向字节流,常用于FTP,HTTP,Telnet协议
    三次握手,四次挥手
3.堆/栈/静态/常量/结构体/共用体
    堆:用户自行申请释放,用于存储生命周期不固定或大小可变的数据结构,内存分配和释放相对较慢,但灵活性高;
    栈:后进先出(LIFO)用于存储局部变量或函数调用的信息,内存分配和释放速度快,但空间有限;
    静态:在程序的生命周期内只分配一次内存,其生命周期与整个程序的执行期相同;
    常量:常量的值在编译时就已经确定,不能被修改
    结构体:将不同类型的数据组合成一个单独的数据结构
    共用体:允许在相同的内存位置存储不同的数据类型
4.TCP和UDP的区别
    基本区别:
        基于连接与无连接
        TCP要求系统资源较多
        UDP程序结构较简单
        TCP基于字节流,用户在应用层需要自己解码;UDP基于数据报
        TCP保证数据正确性和顺序,UDP不保证
    编程区别:
        socket()的参数不同
        UDP Server不需要调用listen和accept
        UDP收发数据用sendto/recvfrom函数
        TCP:地址信息在connect/accept时确定
        UDP:在sendto/recvfrom函数中每次均 需指定地址信息
        UDP:shutdown函数无效
5.gdb调试命令,gcc编译命令
    gcc编译命令:gcc main.c -o main
        -c:只编译并生成目标文件,不进行链接。
        -o:指定输出文件名。
        -g:添加调试信息,使得程序可以被 gdb 调试。
        -Wall:显示所有警告信息。
        -O2:优化级别,O2 是一种常用的优化级别。
        预编译的时候要处理头文件,因此gcc -E的时候需要通过 -l大写的i 来指定头文件搜索路径。
查找路径链接的时候需要各个库,因此gcc -o的时候需要通过**-L指定库文件搜索路径**,以及-l(小写的L)来指定具体的库文件名称。

编译时,加上“-L <库文件目录>”这样的选项,用来指定库目录;
编译时,加上“-labc”这样的选项,用来指定库文件libabc.so。
    gdb调试命令:
        1. `gdb a.out`      进入调试窗口
          2. `l`    拉出程序清单
        3. `b [行号或函数的名字]`       添加断点
        4. `r`      添加断点后运行程序,在断点处停止
        5. `n`      next,执行当前指令,并切入到下一行
        6. `p [变量名或函数名]`       查看变量信息
        7. `info local`    查看函数中局部变量的信息
        8. `s`    切入到函数中调试,并在函数中调试
        9. `q`    退出调试器
6.cmake构建项目,CMakeLists.txt的语法和框架,编写

```
project(mstring)
aux_source_directory(src SRC_SUB)
aux_source_directory(. SRC_CUR)
add_executable(mstring ${SRC_SUB} ${SRC_CUR})
include directories(include)
```
* ``project()``:设置项目名称,参数可以自定义。
* ``aux_source_directory(dir VAR)``:搜索``dir``目录下的所有源文件,并将结果存储在变量``VAR``中。
* ``add_executeable(target src)``:指定使用源文件``src``,生成可执行程序``target``,``${变量名}``是取变量的值。
* ``include_directories(headDir)``:设置包含头文件的目录。==可添加多个目录,目录间以空格隔开==
## 二.执行命令
1. ``cd ./build``cd到项目文件夹下生成的build文件夹
2. ``cmake ..``执行该命令后结果如下:
    ```
    Configuring done (0.1s)
    Generating done (0.0s)
    Build files have been written to: D:/study_note/CODE/library/build
    ```
    说明执行成功!
3. 根据Makefile中的构建规则构建整个项目
   ``mingw32-make.exe``仍在build文件目录下执行
   ==该执行程序在mingw32安装目录下的bin目录下查看==
   ```
    [ 33%] Building CXX object CMakeFiles/mstring.dir/src/Mstring.obj
    [ 66%] Building CXX object CMakeFiles/mstring.dir/test.obj
    [100%] Linking CXX executable mstring.exe
    [100%] Built target mstring
   ```
    此时生成的可执行程序处于build目录下。

7.QT中的信号与槽
    发射信号使用Qt的emit关键字。定义信号使用QT的signals关键字。信号不能也无需被实现
    定义信号:
        signals:
                void testFun(QString& str); //信号不能也无需实现
    发射信号:
        void fun(){
                QString str="就是这个感觉";
                emit testFun(str);       
        }
    声明槽方法:
        private slots:
                void testFun1(QString& str);
                void testFun2();
                void testFun3();
    使用connect绑定信号与槽:
    connect(this,SIGNAL(Commeon(QString&)),this,SLOT(CommeonGuys(QString&)));
        connect(this,&MainWindow::Common,this,&MainWindow::CommonGuys);
    多种连接方式:包括自动方式,直接方式,队列方式,阻塞队列方式(仅用于多线程)
    信号与槽是松耦合的,信号发送者不知道也不需知道接受者的信息。

8.怎么定位到的问题、怎么解决的问题。

9.通信协议:SPI,IIC,USART,RS-232,RS-485,CAN
    SPI:同步(两个通信时钟一致),高速(50Mbps),通信距离(15cm以下),全双工,TTL电平(逻辑1:2.4v-5v;逻辑0:0v-0.5v),两根数据线
    IIC:同步,半双工,低速,通信距离(理想15m),TTL电平,一根数据线
    SPI比IIC快的原因:SPI协议简单,没有总裁总线等判断
    USART:异步,全双工,低速,TTL电平,两根数据线
    SPI和IIC为同步,有时钟线,USART为异步,没有时钟线
    电平标准RS232,RS485(用的都是USART协议):
        RS232:异步,低速,理论最大传输距离为几十米,全双工,电平(逻辑1:-5v到-15v;逻辑0:+5v到+15v;噪声容限为2v),节点数量为一对一
        RS485:异步,低速,长距离(1千米以上),半双工,差分电平(逻辑1:2v-6v;逻辑0:-6v--2v),节点数量为一对多
        CAN:低速,最远距离(10千米),半双工,一对多
10.C++八股文
11.交叉编译工具链aarch-linux-gun-gcc
12.常量指针,指针常量,函数指针,数组指针,指针函数
    常量指针:
        其本质是指针,指向的对象是常量。也就是说,指针变量本身是可以修改的,即可以指向其他地址,但是指针指向的内容(即所指向的对象)是不可修改的。在C++中,常量指针的声明方式为const 数据类型 *指针变量名,例如const int *p或int const *p。

    指针常量:
        则是指针本身是一个常量。这意味着在定义之后,指针的值(即它所指向的地址)不能再改变,但是指针指向的内容是可以修改的。在C++中,指针常量的声明方式为数据类型 *const 指针变量名,例如int *const p。
13.大端存储,小端存储
    大端存储:数据的高字节存储在内存的低地址位中(多用于网络通信)
    小端存储:数据的高字节存储在内存的高地址位中(X86架构)
14.内存泄漏,野指针
    内存泄漏:内存泄漏是指在程序运行过程中,不再需要的对象仍然占用内存空间,且这部分内存无法被回收,导致程序占用的内存逐渐增加,最终可能导致内存资源耗尽或影响程序性能。内存泄漏的原因可能包括循环引用、内存对象未被销毁、动态分配内存未被释放、长期持有对象引用以及资源未被关闭等情况。
    野指针:指的是那些指向内存被释放的内存或者没有访问权限的内存的指针。换句话说,野指针就是指向了一个不确定的地址空间,或者指向的是一个确定的地址空间,但引用该空间的结果却是不可预知的。
15.什么是DMA
16.static,const,volatile关键字
    static在c语言和c++中的区别:
        1.均被自动初始化为0或空;
        2.c语言中的静态具有内部链接性,而在C++的链接性取决于命名空间,如果在匿名命名空间中则具有内部链接性,在全局命名空间则具有外部链接性;
        3.c中的结构体不支持静态成员;
        4.c++中的类:静态成员属于类本身,只能通过类名去访问;静态成员函数只能访问静态数据成员和其他静态成员函数
    问了一个结构体问占用内存大小,如何改变内存大小(更改成员变量位置,或者取消结构体对齐)内存对齐机制:
        1.从结构体的第二个成员变量开始,每一个成员变量的存储地址都要对齐到对齐数的整数倍(vs中默认对齐数位8,gcc中对齐数为成员变量本身,对齐数选较小值)
        2.结构体的总大小必须是所有成员变量中最大对齐数的整数倍。
        3.嵌套结构体从内部逐步计算
17.编译完的程序在内存中的分布
    1.代码段:用于存放执行的指令,只读,防止程序意外修改指令
    2.数据段:存放程序中已初始化的全局变量和静态变量
    3.堆区:用于动态申请内存空间
    4.栈区:用于局部变量和函数调用
    5.文字常量区:存放常量字符串
18.线程间通信方式,进程间通信方式,消息队列,共享内存的函数。
19.switch中支持浮点数吗
    在switch语句中,通常不支持浮点数。这是因为二进制保存浮点数字不是完全精确的,所以对浮点数进行相等性判断并不可靠。然而,具体的支持情况可能会因编程语言和实现而有所不同。
20.float类型的变量在内存中的存储
    float类型数据在计算机中的存储遵循IEEE-754格式标准,主要由三部分组成:符号位(Sign)、指数位(Exponent)和尾数部分(Mantissa)。

    符号位:用于表示数的正负,0代表正数,1代表负数。
    指数位:用于存储科学计数法中的指数数据,占用8bit的二进制数,可表示的数值范围为0-255。但指数可正可负,所以IEEE规定,此处算出的次方必须减去127才是真正的指数。因此,float类型的指数范围是从-126到128。
    尾数部分:表示实际数值,是二进制表示的小数部分。底数部分实际是占用24bit的一个值,但是最高位始终为1,所以最高位省去不存储,在存储中占23bit。
21.什么是进程,用什么命令查看他,如何杀掉一个进程
    进程是计算机中的程序关于某数据集合上的一次运行活动,它是系统进行资源分配的基本单位,也是操作系统结构的基础。
    ps aux        ---查看所有进程
    kill 进程号    (PID)    ---杀掉进程
22.数据结构与算法
    数据结构:
    1.哈希表:哈希表(Hash table),也称为散列表,是一种根据关键码值(Key value)直接进行访问的数据结构。它通过将关键码值映射到表中一个位置来访问记录,以加快查找速度。这种映射函数称为哈希函数(Hash function),存放记录的数组称为散列表。哈希表的核心思想是将记录的存储位置与其关键字之间建立一个确定的关系,即哈希函数,使得每个关键字和唯一的存储位置对应。哈希表的主要特点是能够快速实现查找、插入和删除操作。
    2.图表:分为无向图和有向图;无向图中节点的度是关联的边数;有向图的度分为内部度数和外部度数。
    3.树:树是一个无环连通无向图
    4.二叉树:除了叶子节点,其他每个节点都具有两个孩子节点
    5.哈夫曼树:带权路径长度
    6.红黑树:

    排序算法:插帽龟稳定
    1.插入排序:
        直接插入:
        shell排序:对每一个子表(以步长为规则建立)进行直接插入排序,更改步长(折半)重新进行shell排序
    2.选择排序:
        直接选择:先扫,再找,放入最前
        堆排序:建堆,大顶堆,小顶堆
    3.交换排序:
        冒泡排序:
        快速排序:左右指针,大小交换,移动指针

Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐