诺瓦星云面试汇总

目录

1、C语言向一个内存地址写值,

2、申请释放内存

3、makefile

4、socket   I/O复用

5、strcpy与strcat

6、内存的分配

7、new 和  malloc

8、Tcp和udp的区别

9、嵌入式linux的调试方式

10、iic  上拉电阻的作用

11、指针常量与常量指针

12、内存泄漏

13、野指针

14、链表和数组的区别

15、反转链表

16、Linux gcc编译命令

17、spi(多少根线,时序等) iic(多少根线,时序等)

18、有没有用过示波器,逻辑分析仪

19、说一下server端网络编程的步骤

20、static,const,volatile关键字

21、static关键字在c语言中和c++中有何不同

25、如果大量频繁的申请堆空间会发生什么?

29、linux内核,TCP/IP中源socket怎么回事,三种socket报文模式

31、内存拷贝函数与字符串拷贝函数

32、查找文件的命令

33、管道

34、内核与用户的转换

35、互斥量与信号量的底层

36、OSL七层模型、五层模型

37、冒泡排序

38、查看tty设备方法

39、数组与指针的区别


1、C语言向一个内存地址写值,

int main() {
    int value = 42;
    int *ptr = (int *)0x12345678;  // Replace with the desired memory address
    *ptr = value

2、申请释放内存

申请内存

int *dynamicArray  = (int*)malloc(size *sizeof(int));

释放内存  

     free(dynamicArray)

    

3、makefile

makefile 我只会模仿改写makefile的基本思路 是查第一行目标文件有没有的依赖文件,如果没有,就在下面的代码的目标文件中查找,有就执行相应的代码

clean:
       rm -f myprogram
 行 make clean 就会执行 clean 目标,删除名为 myprogram 的文件

all: main.c utils.c   (all 默认)
     gcc -o myprogram main.c utils.c
 test: myprogram(test  目标名字   myprogram  依赖名字)
            ./myprogram test_input.txt
执行make   执行all下命令
执行 make test  执行test下命令

引入库
  

1、写好路径

2、库和路径添加到链接命令中

导入模板
 
include common.mk  ,这样makefile就导入模板了

4、socket   I/O复用

select函数,可以监听的数目有限制,并且每次都调用select函数的时候都需要将fd集合从用户态拷贝到内核态 ,同时每次调用select都需要在内核遍历传递进来的所有fd,这个开销在fd很多时也很大

 

2、po'll 开销也比较大,但是因为fd使用链表这样的话,数目限制就不存在了

 

3、epoll将主动轮询变成被动通知,当有事情发生时,接收到通知后再去处理,也就是epoll会把哪个流发生哪种i/o事件通知我们,epoll是事件驱动(每个事件关联到fd),epoll底层是红黑树,epoll内部使用事件驱动的机制,内核中维护了一个链表来记录就绪事件,当某个socket有事件发生时,通过回调函数内核将其加入到就绪事件链表中,

当用户调用epoll_wait()函数时,只会返回有事件发生的文件描述符的个数,不需要像select和poll那样进行轮询,大大提高了检测的效率

诺瓦星云面试汇总_第1张图片

5、strcpy与strcat

strcpy  地址拷贝

strcat   值拷贝

6、内存的分配

1、堆(地址从上到下递减)

2、栈(地址从上到下递增)

3、全局变量区\静态变量区(未初始化bss  初始化data)

4、文本区(代码本文 + 常量)

7、new 和  malloc

两个分配的都是在堆空间,new 不需要指定空间大小,new 分配完还会调用构造函数初始化

8、Tcp和udp的区别

TCP不能直接传输,需要连接具有可靠性,适合高质量传输,但是速度慢
UDP可以直接传输,但是不安全,速度也快

9、嵌入式linux的调试方式

应用中 printf  
驱动内核中  printk

gdb调试运行

10、iic  上拉电阻的作用

1、高电平

 2、开漏输出

11、指针常量与常量指针

指针常量 :指针是一个常量,指针指向不能变

常量指针:指针指向的是一个常量

12、内存泄漏

是指程序在申请内存后无法释放已申请的内存空间,导致系统无法及时收回内存并且分配给其他进程使用

1、动态分配的内存没有被释放:当使用关键字 new 或 malloc 分配内存时,应该使用对应的 delete 或 free 函数来释放内存。如果没有正确释放,就会导致内存泄漏

2、丢失对分配内存的指针

3、c++中子类析构函数没有设置为虚函数

13、野指针

野指针不是NULL指针,是指向被释放的或者访问受限的内存的指针

1、指针变量没有被初始化,任何刚创建的指针不会自动成为NULL

2、指针被free或delete之后,没有置NULL

3、指针操作超越了变量的作用范围,比如要返回指向栈内存的指针或引用,因为栈内存在函数结束时会被释放

14、链表和数组的区别

访问元素效率:

  • 数组:由于数组的元素在内存中是连续存储的,访问元素的效率非常高,只需要通过索引即可。

  • 链表:链表的元素分散在内存中不同位置,访问元素需要按照节点指针的顺序遍历,效率较低。

15、反转链表

需要三个指针,一个pre指针指向反转的前一个节点,cur指向要反转的节点,然后设置有一个temp指针指向需要反转的下一个节点,用来使得cur指针移动,因为我们反转之后,无法使用next指针访问到后一个节点

16、Linux gcc编译命令

1、预处理 gcc -E hello.c -o hello.i(头文件展开,进行源文件中的宏替换,注释过滤)

2、编译    gcc -S hello.i -o hello.s(将源文件编译成汇编文件)

3、汇编    gcc -c hello.s -o hello.o(将汇编文件转换成二进制文件)

4、链接   gcc hello.o -o hello(将二进制文件打包成可执行文件

17、spi(多少根线,时序等) iic(多少根线,时序等)

18、有没有用过示波器,逻辑分析仪

19、说一下server端网络编程的步骤

20、static,const,volatile关键字

21、static关键字在c语言中和c++中有何不同

  1. 类的静态成员变量和函数: 在 C++ 语言中,static 关键字被广泛用于类的静态成员变量和静态成员函数。静态成员变量是类的所有对象共享的变量,而静态成员函数不属于任何特定对象,可以直接通过类名调用。

  2. 函数内的静态变量: C++ 中的函数内的静态变量的作用与 C 语言类似,仍然将变量的作用域限制在函数内,并保持其值在函数调用之间不变。

  3. 命名空间中的静态变量: 在 C++ 中,static 关键字还可以用于命名空间内的静态变量,这将限制变量的作用域在命名空间内,并且在不同文件中可以共享

22、问了一个结构体问占用内存大小,如何改变内存大小(更改成员变量位置,或者取消结构体对齐)

23、栈和队列的区别

24、编译完的程序在内存中的分布

25、如果大量频繁的申请堆空间会发生什么?

内存泄漏

堆碎片化

性能下降

系统崩溃

29、linux内核,TCP/IP中源socket怎么回事,三种socket报文模式

源socket"通常指的是套接字(socket)的一个端点

三种报文形式
面向连接的套接字(SOCK_STREAM)

面向消息的套接字(SOCK_DGRAM)

原始套接字(Raw Socket

30、共享内存函数

31、内存拷贝函数与字符串拷贝函数

memcpy():用于从源内存地址复制一定数量的字节到目标内存地址。

字符串拷贝  strcpy

32、查找文件的命令

find /path/to/search -name "filename.ext"
 

33、管道

linux  命令中的管道

    了命令行中的管道(|)用于将一个命令的输出连接到另一个命令的输入外

  

34、内核与用户的转换

1、中断

2、异常

3、系统调用

35、互斥量与信号量的底层

通常涉及原子操作和线程阻塞。

36、OSL七层模型、五层模型

37、冒泡排序

38、查看tty设备方法

39、数组与指针的区别

  • 数组的大小固定,而指针可以动态指向不同的数据。

  • 内存布局:数组的元素在内存中是连续存储的,而指针可以指向任何内存位置。

  • 访问方式:数组通过下标直接访问元素,而指针需要通过解引用操作来访问所指向的数据。

  • 声明方式:数组声明时需要指定大小和数据类型,而指针声明只需要指定数据类型。

你可能感兴趣的:(java,开发语言)