本文主要是介绍8.15笔试题(中玉科技)嵌入式c,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
简答题
1.extern全局变量,static全局变量,static局部变量的生存期是多少
extern全局变量
生命周期:从程序开始到程序结束
作用域:全局作用域:只需在一个头文件中定义,就可以作用与全部的源文件
内存分布:静态储存区
如果两个文件都定义了相同的全局变量,则连接错误
static全局变量
生命周期:从程序开始到程序结束
作用域:文件作用域(static还有一个作用就是隐藏)
内存分布区:静态储存区
static 局部变量
生命周期:程序运行期一直存在
作用域:局部
内存分布:静态储存区
2.宏和内联函数的区别
内联函数的执行过程与带参宏函数的执行很相似,但是宏只是单纯的文本的替换,
内联函数首先是函数,这就意味着函数的很多性质都适用于内联函数,即内联函数先把参数表达式进行运算求值,然后把表达式的值传递给形式参数。
宏在编译之前进行,即先用宏体替换宏名,然后再编译的,而函数显然是编译之后,在执行时,才调用的.因此,宏占用的是编译的时间,而函数占用的是执行时的时间.
作为内联函数,函数体必须十分简单,不能含有循环、条件、选择等复杂的结构,否则就不能做为内联函数了
因此,函数调用要有一
定的时间和空间方面的开销,于是将影响其效率。而宏只是在预处理的地方把
代码展开,不需要额外的空间和时间方面的开销,所以调用一个宏比调用一个
函数更有效率。
3.New dalete 和malloc free的区别
1.malloc是c库中的标准函数,new delete是c++的关键字,使用new可以根据类型信息自行开辟出所需要的内存,而malloc则要手动定义内存大小。
2.malloc内存分配成功使,分配的是void*指针,需要转换成所需要的类型,new内存分配成功使,返回的是对象类型的指针,无需进行类型转换
new会先调用operator new函数,申请足够的内存(通常底层使用malloc实现)。然后调用类型的构造函数,初始化成员变量,最后返回自定义类型指针。delete先调用析构函数,然后调用operator delete函数释放内存(通常底层使用free实现)。
4.使用bind等函数写出tcp建立流程
服务器
bind(int socket_fd,const struct sockaddr*addr,socket_addren);
listen(socket_fd,backlog)
堵塞
accept(int socket_fd,const struct sockaddr*addr,socket_addren);
客户端
connec(int socket_fd,const struct sockaddr*addr,socket_addren);
5.n个人报圈问题
#include<stdio.h>#define max 15int main(){int i,k,n,m,num[max],*p;printf("输入开始报数时总人数:");scanf("%d",&n);//开始报数前的人数。p=num;//指针指向数组第一位num[0]for(i=0;i<n;i++)//把n个人进行编号为1—n。*(p+i)=i+1;printf("依次出圈的人的编号:");i=0;k=0;m=0;while(m<n-1)//m为圈外人数。当m=n-1时,不再执行while循环,此时圈内还有一个人。{if(*(p+i)!=0)//报数。k++;if(k==3){printf("%d ",*(p+i));//按顺序依次输出出圈的人的编号。*(p+i)=0;//对于出圈人数,其值置为0。m++;//圈外人数加1。k=0;//重新开始报数。}i++;//指针指向下一位。if(i==n)//指针移到最后一位时,重新赋值i=0;//printf("\n");}for(i=0;i<n;i++)//输出最后一位出圈的人的编号if(*(p+i)!=0)printf("\n最后一位出圈的人的编号:%d\n",*(p+i));return 0;}
6.嵌入式题目
1.看门狗作用
是一个定时器电路,一般有一个输入,叫喂狗(kicking the dog or service the dog),一个输出到MCU的RST端,MCU正常工作的时候,每隔一段时间输出一个信号到喂狗端,给 WDT 清零,如果超过规定的时间不喂狗,(一般在程序跑飞时),WDT 定时超过,就会给出一个复位信号到MCU,使MCU复位. 防止MCU死机. 看门狗的作用就是防止程序发生死循环,或者说程序跑飞。
2.简述spi总线和iic总线的通信原理
iic
/etc/profile
此文件则是在系统进入控制台后第一个调用的文件,这个文件中的内容主要是来设置环境变量的
4.fork和vfork的区别
fork函数创建的子进程的虚拟地址空间是复制父进程的,在进行写操作之前,父子的物理页面是共享的,而当要进行写操作时,内核才会给要进行写操作的进程重新分配一个物理页面;而vfork函数的父子进程时共享虚拟地址,从而也共享了物理地址。换句话说,也就是fork函数复制父进程的数据段,代码段;而vfork函数父子进程共享数据段。fork函数父子进程执行的次序不确定,它是由调度器来=来决定的;而vfork函数会保证子进程先运行,再被调用exit或exec后父进程才可能会运行。vfork 保证子进程先运行,在她调用exec 或exit 之后父进程才可能被调度运行。如果在 调用这两个函数之前子进程依赖于父进程的进一步动作,则会导致死锁。
内存空间分配
执行次序
5.exit _exit Exit的作用
fopen fwrite fread文件时,会多读出若干条记录,这样下次读文件时就可以直接从内存的缓冲区中读取,每次写文件的时候,也仅仅是写入内存中的缓冲区,等满足了一定的条件(达到一定数量,或遇到特定字符,如换行符和文件结束符EOF), 再将缓冲区中的 内容一次性写入文件,这样就大大增加了文件读写的速度,但也为我们编程带来了一点点麻烦。如果有一些数据,我们认为已经写入了文件,实际上因为没有满足特 定的条件,它们还只是保存在缓冲区内,这时我们用_exit()函数直接将进程关闭,缓冲区中的数据就会丢失,反之,如果想保证数据的完整性,就一定要使用exit()函数。
所以exit是将缓冲区的数据写入文件内?保证数据的完整性
这篇关于8.15笔试题(中玉科技)嵌入式c的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!