企业真题4~6月
联发科4月笔试真题
选择1.能正确表示a,b,c中至多有两个大于0的是A.(a>0) || (b>0) || (c>0)B.(a<0) || (b<0) || (c<0)C.(a> 0 && b>0) || (a>0 && c>0) || (b>0 && c>0)D.(a<0 || b<0) && (a<0 || c<0)&&(b<0||c<0)
2.如下程序的输出结果是()
int main(int argc, char* argv[]) { int a[]={3,6,4,6,6,3,3,-1,3,6,4,6,6,3,3,-2}; int i = 0; int sum=0; int cnt=0; do { sum+=a[i]; if (x[i++]<=0) continue; cnt++ )while(i<sizeof(a)/sizeof(int)); printf("%d,%d",cnt,sum); return 0; }
A.14,59
B.16,59
3.如下代码执行结果
typedef union { int a; char b; double c; }test; int main(int argc, char* argv[]) { test val; val.a = 66; printf("val len is %d,val.b = %c,val.c = %d \n",sizeof(val),val.b,val.c); return 0; }
A.13,66,66
B.8,66,66
C.8,B,66
D.13,B,66
4.如下代码执行结果
int main() { int a[5][5]; int (*p)[4]; p = (int (*)[4])a; printf("%d,%d\n",&p[0][0]-&a[0][0],&p[4][2]-&a[4][2]); }
A.0,0
B.0,4
C.4,4
D.0,-4
5.如下代码执行结果
int main() { int aa[2][5] = { 1,2,3,4,5,6,7,8,9,10}; int *ptr1=(int*)(&aa+1); int *ptr2 =(int*)(*(aa+1)); printf(“%d, %d”,*(ptr1 - 1),*(ptr2 - 1)); return 0; }
A.5,5
B.10,5
C.2,5
D.10,2
6以下C函数将单链表作为输入参数,它将最后一个元素移动到链表的前面,并返回修改后的链表。请你选择空白处正确的代码()【错选/漏选不得分】
typedef struct node { int value: struct node *next; }Node; Node *move_to_front(Node*head) { Node *p,*q; if ((head=- NULL)||(head->next== NULL)) return head; q=NULL; p=head; while(p-> next !=NULL) { q= p; p=p->next; } ------ return head; }
A.q->next=NULL;head =p;p->next=head;B.q =NULL;p->next=head;head=p;C.q->next = NULL; p->next = head; head =p;D. head= p;p->next =q;q->next=NULL;
7.用于临界区保护临界区CS,实现方式是通过原子操作test-and-set来实现的;X是一个与CS相关的memory上的数值,初始值为0。以下说法正确的是()A.在访问临界区CS时,不会出现死锁问题B.在访问临界区CS时,不会出现某个进程饿死的场景C.多个进程访问临界区CS时,遵循FIFO原则D.可能出现多个进程同时访问到临界区CS
8.在漆黑的夜晚六位旅行者来到一座狭窄的桥边。6个人只带了一只手电筒,而桥窄的只够两个人同时过。如果独自过桥的话,六人所需要的时间分别是3、5、7、9、11、13分钟;而如果2人同时过桥,所需的时间就是走得较慢的那个人单独行动时所需的时间,则6个人过桥至少需要的时间是()
A.48B.53C.57D.69
9.甲、乙、丙、丁4人是仓库的保管员。一天仓库被盗,经过侦查,最后发现这4个保管员都有作案的嫌疑。又经过核实当前发现是4个人中的两个人作的案,在盗窃率发生的那段时间,找到的可靠线索有
1.甲、乙两个中有且只有一个人去过仓库;2.乙和丁不会同时去仓库;3.丙若去仓库,丁必一同去;4.丁若没去仓库,则甲也没去那么,你可以判断是哪两个人作的案吗?
A.甲B.乙C.丙D.丁
10.11,21,1211,111221,下一个数是()
A.11112211
B.11123221
C.1122121
D.312211
填空
1.假设某同步时钟总线宽度为64位,一个总线周期占用4个时钟周期,总线的时钟频率为56MHZ,则总线的带宽为
2.下面程序输出结果为
int func(int a) { static int c = 0; int b = 0; b++; c++; a+=b+c; return a; } void main() { static int a = 1; int i = 0; for(i=0;i<3;i++) printf("%d\n",func(a)); return; }
3.补全下面代码,使其满足条件
struct X { X(int a):i(a){} int i; }; struct Y { X x; Y(int a):____ //使得x.i=a }
4.下面程序的输出
struct A{ virtual ~A(){cout<<"A";} virtual void func(string a){ cout<<"C"; } void func(int a=1){ func("do something"); } }; struct B:public A{ ~B(){cout<<"B";} void func(string a){ cout<<"D"; } }; int main() { A*a = new B; a->func(); delete a; return 0; }
5.每个进程都有自己的进程描述符,进程描述符中表明进程地址空间的全部信息称为:
内存描述符(Memory Descriptor),这个结构的类型是mm_struct
6.按要求填空
class CMySocket:_____//私有继承自父类CSocket { public: ____;//声明构造函数,int类型形参m,n的默认值都 ~CMySocket(): _____://声明返回类型为void的虚函数Connect _____://声明返回类型为int的友元函数 }
7.写出下列打印结果
class Boss_1 { public: virtual void print(void); private: int m; int n; }; class Boss_2 { public: void print(void); private: int m; }; class Boss_3:publib Boss_1 { public: void print(void); }; class Boss_4:publib Boss_2 { public: void print(void); private: int n; }; void fun(void) { cout<<sizeof(Boss_1)<<endl; cout<<sizeof(Boss_2)<<endl; cout<<sizeof(Boss_3)<<endl; cout<<sizeof(Boss_4)<<endl; }
简答
找出下面程序的错误
char* my_strcat(char* dest, const char* src) { char *p = dest; int dest _len= strlen(dest); if(NULL == dest || NULL == src) { return NULL; } p = dest + dest_len-1; while(*p++ = *src++); return *dest; } int main(void) { char dest[100]="welcome to"; char* src= "Mediatek!"; my_strcat(dest, src); printf("%s",dest); }
编程
写出删除某个链表指定节点的代码,并返回链表头
ALC造极智控面试
全局变量可以和局部变量同名吗?会有什么影响?
可以,如果一个局部变量和全局变量同名,那么在局部作用域内,该局部变量将会屏蔽全局变量,即程序将使用局部变量而不是全局变量。如果需要在函数内使用全局变量,你可以使用关键字extern
static的用途
太常见了不多说了
进程跟线程的差别
1、进程是资源分配和调度的单位,线程是CPU调度和分配的基本单位
线程是依赖于进程,一个进程可以包含多个线程,但是一定有一个主线程.线程才是CPU执行的最小单元
2、不同进程的地址空间是独立的,而同一进程内的线程共享同一地址空间
3、新线程很容易创建(创建的开销很少,速度很快);新进程需要父进程的重复(需要开辟空间,复制资源,开销比开启线程多10-100倍)
4、线程可以对同一进程的线程进行相当大的控制; 进程只能对子进程进行控制
5、对主线程的更改(取消、优先级更改等)可能会影响进程的其他线程的行为; 对父进程的更改不会影响子进程.
七层网络,TCP属于哪一层
口诀:物联网淑慧适用
物理层,数据链路层,网络层,传输层,会话层,表示层,应用层
TCP/UDP属于传输层
TCP和UDP的区别
TCP通过三次握手建立连接,四次挥手解除连接;UDP是无连接的
TCP是可靠的通信方式,UDP是不可靠传输
TCP面向字节流UDP面向数据报
TCP连接只能是点到点的,UDP没有限制
使用场景不同:
TCP用来传文件、网络付费、传输加密数据等对可靠性要求高的场景
UDP用在音视频通话、直播、广播通信等场景
TCP三次握手和四次挥手的过程
使用多进程实现并发设计一个通信协议
- 定义通信协议:首先需要定义通信协议,包括消息格式、消息类型和处理规则等。这是协议的基础,也是进程之间交互的基础。
- 创建进程和管道:使用fork()函数创建多个进程,使用pipe()函数创建多个管道。
- 在每个进程中,通过管道来实现进程间的通信:进程之间可以通过管道来进行双向通信,一个进程通过管道发送数据,另一个进程通过管道接收数据。
- 使用select()函数实现多路复用:可以使用select()函数来实现多路复用,这样每个进程都可以同时监听多个管道。
- 处理数据:每个进程从管道读取数据后,可以根据数据类型进行相应的处理。可以使用类似于消息队列的方式,在管道中传输数据。
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/wait.h> #include <sys/select.h> #define BUF_SIZE 1024 int main() { int fd1[2], fd2[2], nbytes; pid_t pid1, pid2; char buf[BUF_SIZE]; if (pipe(fd1) < 0 || pipe(fd2) < 0) { // 创建两个管道 perror("pipe"); exit(1); } if ((pid1 = fork()) < 0 || (pid2 = fork()) < 0) { // 创建两个子进程 perror("fork"); exit(1); } if (pid1 == 0) { // 子进程1 close(fd1[0]); // 关闭管道1的读端 close(fd2[1]); // 关闭管道2的写端 while (1) { // 不断循环进行通信 fd_set rfds; FD_ZERO(&rfds); FD_SET(fd2[0], &rfds); // 将管道2的读端加入监听集合 int maxfd = fd2[0] + 1; int ret = select(maxfd, &rfds, NULL, NULL, NULL); // select 函数进行监听 if (ret < 0) { perror("select"); exit(1); } if (FD_ISSET(fd2[0], &rfds)) { // 如果管道2的读端可读 nbytes = read(fd2[0], buf, BUF_SIZE); // 从管道2读取数据 if (nbytes == 0) { // 如果读取的数据长度为0,则退出循环 break; } printf("Process 1 received message: %s\n", buf); } } close(fd1[1]); // 关闭管道1的写端 close(fd2[0]); // 关闭管道2的读端 exit(0); } else if (pid2 == 0) { // 子进程2 close(fd1[1]); // 关闭管道1的写端 close(fd2[0]); // 关闭管道2的读端 while (1) { // 不断循环进行通信 fd_set rfds; FD_ZERO(&rfds); FD_SET(fd1[0], &rfds); // 将管道1的读端加入监听集合 int maxfd = fd1[0] + 1; int ret = select(maxfd, &rfds, NULL, NULL, NULL); // select 函数进行监听 if (ret < 0) { perror("select"); exit(1); } if (FD_ISSET(fd1[0], &rfds)) { // 如果管道1的读端可读 nbytes = read(fd1[0], buf, BUF_SIZE); // 从管道1读取数据 if ( nbytes == 0) { // 如果读取的数据长度为0,则退出循环 break; } printf("Process 2 received message: %s\n", buf); write(fd2[1], buf, nbytes); // 将数据写入管道2 } } close(fd1[0]); // 关闭管道1的读端 close(fd2[1]); // 关闭管道2的写端 exit(0); } else { // 父进程 close(fd1[0]); // 关闭管道1的读端 close(fd2[0]); // 关闭管道2的读端 char *msg1 = "Hello from process 1!"; char *msg2 = "Hello from process 2!"; write(fd1[1], msg1, BUF_SIZE); // 将数据写入管道1 write(fd1[1], msg2, BUF_SIZE); // 将数据写入管道1 wait(NULL); // 等待子进程1结束 wait(NULL); // 等待子进程2结束 close(fd1[1]); // 关闭管道1的写端 close(fd2[1]); // 关闭管道2的写端 exit(0); } return 0;
上述代码中,父进程创建了两个管道和两个子进程。子进程1通过 select 函数监听管道2的读端,子进程2通过 select 函数监听管道1的读端,并将从管道1读取的数据写入管道2中。父进程通过写入管道1向两个子进程发送数据。三个进程之间的通信通过两个管道进行。这样,就实现了三个进程间的并发通信。
在多进程并发通信协议中,使用管道作为进程间通信方式的原因主要有以下几点:
- 管道是最简单的进程间通信方式之一,只需要使用两个文件描述符就能完成进程之间的双向通信。
- 管道是半双工的,只能单向传输数据,但是可以通过创建两个管道来实现双向通信。
- 管道是基于文件的通信方式,可以使用类似于文件操作的方式来进行数据的读取和写入,使用起来非常方便。
- 管道可以使用select函数进行多路复用,可以同时监听多个管道,实现多进程并发通信。
数组和链表的区别
太常见了不多说
使用两个栈实现一个队列
入队列进栈一,出队列:栈一数据全部推到栈二,然后栈二数据出栈就可以实现先进先出
删除队列第一个元素就是删除栈二第一个元素
void push(int x) 将元素 x 推到队列的末尾
int pop() 从队列的开头移除并返回元素
int peek() 返回队列开头的元素
boolean empty() 如果队列为空,返回 true ;否则,返回 false
typedef struct { int stack1[200]; int top1; int stack2[200]; int top2; } MyQueue; /** Initialize your data structure here. */ MyQueue* myQueueCreate() { MyQueue *obj = (MyQueue*)malloc(sizeof(MyQueue)); obj->top1 = 0; obj->top2 = 0; return obj; } /** Push element x to the back of queue. */ void myQueuePush(MyQueue* obj, int x) { obj->stack1[obj->top1++] = x; /* 入队到S1 */ } /** Removes the element from in front of queue and returns that element. */ int myQueuePop(MyQueue* obj) { if (obj->top2 == 0) { while (obj->top1 != 0) { /* S1元素弹出, 进入S2 */ obj->stack2[obj->top2++] = obj->stack1[--obj->top1]; } } return obj->stack2[--obj->top2]; /* 从S2中弹出元素 */ } /** Get the front element. */ int myQueuePeek(MyQueue* obj) { if (obj->top2 == 0) { while (obj->top1 != 0) { /* S1元素弹出, 进入S2 */ obj->stack2[obj->top2++] = obj->stack1[--obj->top1]; } } return obj->stack2[obj->top2 - 1]; /* 获取栈顶元素, 不用弹出元素 */ } /** Returns whether the queue is empty. */ bool myQueueEmpty(MyQueue* obj) { return obj->top1 == 0 && obj->top2 == 0; } void myQueueFree(MyQueue* obj) { free(obj); } 作者:liu-xiang-3 链接:https://leetcode.cn/problems/implement-queue-using-stacks/solution/cyu-yan-shuang-zhan-shi-xian-dui-lie-dai-b5cd/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
字节对齐计算题
手写一道字符串拼接函数strcat
// 自定义 strcat 函数 char* my_strcat(char* dest, const char* src) { assert(dest!= NULL&&src!= NULL));//断言两个字符串不为空 char* p = dest; while (*p != '\0') { // 移动指针至 dest 字符串的末尾 p++; } while (*src != '\0') { // 将 src 字符串拼接到 dest 字符串末尾 *p++ = *src++; } *p = '\0'; // 在 dest 字符串末尾添加 '\0' return dest; }
assert 函数是一个标准库函数,其目的是为了检查程序运行时的错误条件。它接受一个表达式作为参数,如果该表达式的值为 false,则 assert 函数会终止程序的执行,并在标准错误输出上打印出错误信息,包括发生错误的文件名、行号和错误信息。assert 函数只有在调试模式下才有效,因此在发布版本中不应该使用 assert 函数。
HTTP协议和mqtt协议有什么区别
- 用途不同:HTTP协议是一种应用层协议,常用于客户端与服务器之间的数据传输,例如浏览器请求网页、下载文件等;MQTT协议是一种轻量级消息协议,主要用于物联网设备之间的消息传递。
- 通信方式不同:HTTP协议采用的是请求-响应模式,即客户端向服务器发送请求,服务器返回响应;MQTT协议则是发布-订阅模式,客户端可以发布消息到服务器,其他客户端可以订阅这些消息并接收到。
- 数据格式不同:HTTP协议传输的数据格式一般为HTML、JSON等文本格式;MQTT协议传输的数据格式一般为二进制格式,可以自定义。
- 网络传输方式不同:HTTP协议使用的是TCP协议,因此数据传输比较可靠,但是对于实时性要求较高的应用场景,可能会存在延迟等问题;MQTT协议可以使用TCP或UDP协议,具有轻量级、低开销的优势,在网络质量不好的情况下能够更好地保证消息的传输效率和实时性。
- 安全性不同:HTTP协议可以使用HTTPS协议来加密数据传输,保证通信安全;MQTT协议也提供了TLS/SSL加密方式,但相对来说在安全性方面可能没有HTTP协议那么高。
MQTT协议哪一种qos等级对带宽影响最大
- QoS等级为0:最简单、带宽消耗最小的一种等级,消息只需要被发送一次,不需要确认,不保证可靠传输。
- QoS1级别:当发布者发布一条消息时,它会在等待收到确认(ACK)后才会继续进行后续操作。接收方在收到一条消息后,会回复一个ACK消息告知发送方收到了该消息。如果发送方在一定时间内没有收到ACK,它会重新发布消息,直到接收方返回ACK消息。这种级别可以保证消息至少传输一次,但可能会重复传输。
- QoS2级别:当发布者发布一条消息时,它会等待收到一个确认(PUBREC)消息,这个确认消息会告诉它该消息已经被接收方收到。接收方在收到一条消息后,会返回一个确认(PUBREC)消息,告诉发送方它已经接收到了该消息。接着,发送方会返回一个确认(PUBREL)消息,告诉接收方可以进行下一步操作。最后,接收方返回一个最终确认(PUBCOMP)消息,告诉发送方该消息已经成功传输。这种级别可以保证消息恰好传输一次,不会出现重复传输的情况,但由于需要传输多个消息,因此传输效率相对较低。
QoS等级为2:最复杂、带宽消耗最大的一种等级,发送方需要等待接收方的确认消息,如果确认消息丢失或者接收方未收到消息,则发送方需要重新发送消息,保证可靠传输。这种等级可能会带来较大的带宽开销和较长的延迟。
广州宏视笔试
strncpy的第三个参数大小超过了str2的大小会导致栈溢出,程序崩溃
(1)由于一个扇区为512字节,可以计算出一共有多少个扇区:
16GB = 16 × 1024 × 1024 × 1024 bytes = 17,179,869,184 bytes
17,179,869,184 bytes ÷ 512 bytes/sector = 33,554,432 sectors
因此,16GB的FAT32分区共有33,554,432个扇区。
(2)8KB簇包含64个扇区,因为1个扇区的大小是512字节,所以8KB(8 x 1024字节)的簇包含的扇区数量为:8 x 1024 / 512 = 16,即一个簇包含16个扇区。
(3)首先,32GB的FAT32分区有多少个扇区可以通过以下公式计算:
32GB = 32 * 1024MB 32 * 1024MB = 33,554,432KB 33,554,432KB / 512B = 65,536,000 sectors
然后,计算每个簇包含的扇区数,由于采用32KB簇,每个簇包含的扇区数为:
32KB = 32 * 1024B 32 * 1024B / 512B = 64 sectors
因此,保留6个扇区后,DATA数据区的簇数为:
(65,536,000 - 6) / 64 = 1,024,125 簇
因此,32GB的FAT32分区,按照32KB簇进行格式化后,DATA数据区总共有1,024,125个簇。
经纬恒润嵌入式软件笔试
1、下面总线采用异步时序协议的是
1、USB
2、I2C
3、SPI
4、PCI
2、设有int x=11;则表达式(X++*1/3)的值是
1、11
2、12
3、4
4、3
3、为了比较两个字符串s1和s2是否相等,应当使用()
1、if(strcmp(s1, s2)==0)
2、if(strcmp (&s1, &s2) ==0)
3、if(s1==52)
4、if(s1=s2)
4、C语言程序是由什么组成的?
1、一个主函数和若干子程序
2、若干子程序
3、函数
4、一些可执行语言
5、Linux中,若系统的umask设置为022,创建一个新文件的权限是?
1、-rwxr-xr-x
2、-rw--r--
3、-rwxr--r--r
4、-rwxrwxrwx
解释:022表示默认创建新文件权限为755 也就是 rxwr-xr-x(所有者全部权限,属组读写,其它人读写)
6、c语言程序的基本单位是
1、函数
2、字符
3、语句
4、程序行
7、使用哪个命令可以检测基本的网络连接:
1、netstat
2、ifconfig
3、route
4、ping
8、下面代码段的输出是()
#include <stdio.h> int tmp=20; func() { static int tmp=10; printf("%d " ,tmp); } int main() { printf("%d ",tmp);func(); printf("%d " ,tmp); return 0; }
1、20 20 20
2、10 10 10
3、20 10 20
4、20 10 10
9、代码段
{struct Date{ char a; int b; int64_t c; char d; }; struct Date data[2][10];
假设data首地址为x,data[1][5].c地址为多少
1、x+368
2、x+215
3、x+365
4、x+195
解析:data[1][5]是数组中第15个元素(1*10+5)*24,data[1][5].c之前还存了char a和int b,还要加上这部分存储
1+(3)+4,所以答案是x+(1*10+5)*24+1+(3)+4=x+368
10、下列关于C语言常量的声明正确的是
1、const int var = 5;
2、const char* var = 5;
3、const int var; var =5;
4、const int var;
不定项选择题:
1、关于子进程和文进程的说法,以下错误的是
1、父进程被撤销时,其所有子进程也被相应撤消
2、一个父进程可以创建若干个子进程,一个子进程可以从属于若干个父进程
3、一个进程可以没有父进程或子进程
4、子进程被撤销时,其从属的父进程也被撤销
2、下面那个是显示文件内容的命令
1、more
2、file
3、less
4、cat
3、下面关于C语言函数返回值类型的描述,那些是错误的()
1、函数返回除数组、函数、联合(union)类型外之外的任何类型
2、函数返回除数组、国数、函数指针、联合(union)类型外之外的任何类型
3、函数返回除数组和函数类型外之外的任何类型
4、函数可以返回任何类型
4、STM32的可编程通用定时器的时基单元包含?
1、自动装载寄存器TIMx_ARR
2、重复次数寄存器TIMx_RCR
3、预分频器寄存器TIMx_PSC
4、技术器寄存器TIMx_CNT
5、定义 int a[8];问下面哪些不可以表示a[1]的地址
1、(int*)(&a+1)
2、(int*)( (char*) &a+sizeof (int))
3、&a[0]+1
4、a+sizeof (int)
#include <stdio.h> int main() { int a[10] = { 1,2,3,4,5,6,7,8,9,0 }; printf("*******输出地址*******\n"); printf("a[0] = %d\n",a); printf("a+sizeof(int) = %d\n",a+sizeof(int)); //a+1为地址加4,这里相当于地址加了16 printf("&a[0] + 1 = %d\n",&a[0] + 1); // 这个加1也是地址加4 printf("(int*)&a+1 = %d\n",(int*)&a+1); // 加1也是地址加5 printf("(int*)((char*)&a+sizeof(int)) = %d\n",(int*)((char*)&a+sizeof(int)));//这里先把地址变成指向char类型指针,然后+4就是按char类型长度加,最后变成指向整型 printf("\n"); printf("*******输出值*********\n"); printf("a[0] = %d\n",*a); printf("a+sizeof(int) = %d\n",*(a+sizeof(int))); printf("&a[0] + 1 = %d\n",*(&a[0] + 1)); printf("(int*)&a+1 = %d\n",*((int*)&a+1)); printf("(int*)((char*)&a+sizeof(int)) = %d\n",*((int*)((char*)&a+sizeof(int)))); return 0; }
填空
2、 代码段{int a[5]={1,2,3,4.5}
int *ptr = (int*)(&a+1);
printf("%d", *(ptr-1));},
其中printf函数的输出值为________5________
解释:&a+1表示ptr指向这个数组的最后一位加1的地址
4、 对于以下递归函数f,调用f(4),其返回值为_________10___
int f (int n){if (n) return f(n-1)+n; else return n;}
解释:0+1+2+3+4
编程题:
1、使用二分法求解开方,要求精确到小数点后第5位
输入样例
2
输出结果
1.41421
float mySqrt(int x){ if(x<2)return x; float left = 1; float right = x; float mid; while(left<right){ mid = (left+right)/2; if(mid == x/mid)return mid; if(mid>x/mid){ right = mid; }else if(mid<=x/mid){ left = mid; } } return right; }
影石
CVTE5月笔试真题
1.下列选项中,不可能在用户态发生的事件是()。
- 系统调用
- 外部中断
- 进程切换
- 缺页
2.设x,y均为float型变量,则以下赋值语句不合法的是( )
A ++X
B y=(x%2)\10
C x*=y+8
D x=y=0
选B,因为求余运算后是整型,即x%2是整型,而y是float, %两边都要求为整型
3.HASH函数冲突处理方式不包括以下哪一项:
- 开放定址法
- 链地址法
- 插入排序法
- 公共溢出区发
4.容器迭代器什么时候失效问题
5.时间复杂度为nlogn的排序算法是
6.-r-xr-xr-x第二组r-x表示的意思是
linux文件权限类问题:
第一位d表示目录,-表示文件
第二段:用户
第三段:用户组
第四段:其他用户
因此这题答案是用户组成员拥有读和可执行权限
7.中断函数代码需要注意哪些事项
8.6个可用的资源,由5个进程共享,每个进程可申请多少个资源不会造成死锁
套公式:
①最多申请资源数=资源总数/进程数(可以整除的条件下)②最多申请资源数=(资源总数/进程数)+1(不可以整除的条件下)
n(x-1)+1≤p,n是共享进程数,p是资源数
答案:2
9.不能被重载的运算符是
A +
B .
C ()
D =
不能被重载的运算符有:
1.作用域操作符: ::2.条件操作符: ?:3.点操作符: .4.指向成员操作的指针操作符:->* , . *5.预处理符号:#
9.下面总线采用分布式仲裁的是
- PCI
- I2C
- USB
- CAN
10.Linux下反编译命令是
A ranlib
B audit2allow
C objcopy
D objdmp
11.关于vim操作说法正确的是
正常模式键入dd可以删除一行
海康威视5月笔试真题
1、关于static关键字错误的是
2、下列四组选项中,均不是C语言关键字的选项是______。
A.define IF type B.getc char printf C.include scanf case D.while go pow
答案A
3、关于二叉排序树说法错误的是
A在二叉排序树中,完全二叉树的查找效率最低
B对二叉排序树进行中序遍历,必定得到节点关键字的有序序列
C二叉排序树的平均查找长度是O(log2n)
D二叉排序树的查找效率与二叉树的树形有关
答案A
二叉排序树中完全二叉树的查找效率最高
4、下面代码n的值是多少
char buf[6]; int n = snprintf(buf, 6, "encoding");
snprintf(),函数原型为int snprintf(char *str, size_t size, const char *format, ...)。
(1) 如果格式化后的字符串长度 < size,则将此字符串全部复制到str中,并给其后添加一个字符串结束符('\0');
(2) 如果格式化后的字符串长度 >= size,则只将其中的(size-1)个字符复制到str中,并给其后添加一个字符串结束符('\0'),返回值为欲写入的字符串长度。
总结
1.snprintf会自动在格式化后的字符串尾添加\0,结尾符是包含在size长度内部的。
2.snprintf会在结尾加上\0,不管buf空间够不够用,所以不必担心缓冲区溢出。
3.snprintf的返回值n,当调用失败时,n为负数,当调用成功时,n为格式化的字符串的总长度(不包括\0),当然这个字符串有可能被截断,因为buf的长度不够放下整个字符串。
因此答案是5
5、关于SPI的说法正确的是
Aspi是全双工
Bspi是异步通信
Cspi是半双工
Dspi能同时选中多个设备
6、linux查找目录中某个字符串的命令
A grep
B find
C cat
D 都不对
答案A
7、运行c程序的步骤
编辑 编译 连接 运行
这题很简单但是我跟编译过程的预编译->编译->汇编->链接搞混了,血亏
8、malloc和calloc的区别,relloc的调用形式
(1) malloc()
在内存的动态存储区中分配一块长度为size字节的连续区域,参数size为需要内存空间的长度,返回该区域的首地址
(2) calloc()
与malloc相似,参数sizeOfElement为申请地址的单位元素长度,numElements为元素个数,即在内存中申请numElements*sizeOfElement字节大小的连续地址空间.并且自动初始化为0
(3) realloc()
给一个已经分配了地址的指针重新分配空间,参数ptr为原有的空间地址,newsize是重新申请的地址长度.
realloc 调用形式为 (类型*) realloc (*ptr,size):将ptr内存大小增大到size
9、哪项操作可在中断上下文中使用
A 分配内存
B 使用信号量
C 自旋锁
D 三者都可以
答案AC
10、在以太网中MTU是多少字节
答案1500
11、平均时间复杂度和最坏时间复杂度均是O(nlogn)的是
A插入排序
B快速排序
C堆排序
D冒泡排序
答案C
12、程序的三种基本控制结构
A选择
B顺序
C调用
D重复
答案ABD
13、找出与192.168.110/27属于同一个知网的主机地址
A 192.168.1.94
B 192.168.1.96
C 192.168.1.124
D 192.168.1.126答案:CD192.168.1.110属于C类IP,C类IP前24位表示网络号,后8位表示主机号。/27说明网络掩码的长度是27位的1和32-27=5位的0组成。也就是说IP地址192.168.1.110前24位表示网络号,25到27位表示子网号,剩下5位表示主机号。第25到27位也就是最后一个字节的前三位,最后一字节110写成二进制的为01101110其前三位是二进制1011,所以接下来就是在选项中找出最后一字节前三位二进制是011的ip地址94=0101 111096=0110 0000124=0111 1100126=0111 1110BCD选项都符合前三位是011,但是B选项除去011之后剩下全零,不能作为主机号,所以CD选项正确
14、指针和引用的区别
15、进程间通信方式
管队存信量网
16、USB总线有哪四种传输
1、控制(Control)方式传输
2、同步(isochronous)方式传输
3、中断(interrupt)方式传输
4、大量(bulk)传输
编程题:
反转字符串中每个单词的字符顺序,保留空格和单词的初始顺序
影石5月15面试
对进程和线程是怎么理解的(进程和线程有什么区别)
进程间通信的方式
驱动中的中断需要注意什么
I2C和SPI的驱动有哪些差异可以简单讲一下吗?
没回答上来,回答了I2C和SPI接口的差异
1、iic主要初始化 i2c_driver 并向 Linux 内核注册,spi主要初始化spi_driver结构体 并向 Linux 内核注册
2、spi device结构体需要包含片选所需要的gpio,并且设备树要设置片选线属性
3、spi使用spi_transfer结构体保存读写寄存器的配置信息,读写寄存器需要软件拉低片选线
iic使用i2c_transfer结构体保存读写寄存器的配置信息,并且要指定读/写的寄存器首地址
怎么理解死锁,如何避免死锁
死锁是由于进程之间相互等待对方释放资源而导致的僵局。
如何避免:
1、按照正确的顺序加锁解锁,不用资源记得解锁
2、检测是否存在死锁
3、请求资源失败时释放自己已获得的资源并重新申请
怎么理解软件测试和开发,如何使用自测手段保证自己代码的质量
没回答好,不懂测试方面的东西,只回答了编写完驱动会写一个测试文件测试驱动有没有问题,貌似没有满足面试官的心理预期
讲一下你对单步调试的理解
讲一下全局变量,静态变量和函数的局部变量的作用域和生命周期
对个人将来的发展和规划有什么想法
回答了将来想从事嵌入式应用开发方面的工作,不考研。
面试官觉得我的规划方向和技术那一块不太清晰,觉得我不太清楚以后要做什么,我的理解是面试官想听具体从事哪个行业或者想做具体哪一种产品,但是我当时没想到这些所以只回答到了大方面。
CVTE3+1面试
众远智慧5月19笔试
1.用预处理指令表示一年有多少秒。
2.写出float x与“零值”比较的if语句
3.为什么说if(0==x)比if(x==0)好?
4.将地址0x8000中存放的整形变量,清除bit1。
5.linux下用shell命令在当前目录下创建myfolder目录,并将此目录的权限设为拥有者可读写,群组和其他成员均可读不可写,且拥有者,群组和其他成员全都不可执行。
6,以下为32位机器上的C程序,请计算下列sizeof的值。
char str[]="hello world"; char*p1 = str; int n = 100; void*p2 = malloc(n);
7.简述代码编译后生成的map文件里面的内容?
8,在数据通信过程中,设置某普通串口的波特率为115200,则此串口每秒能传输多少KB数据。写出推导过程。
9.如下代码的输出是什么?
int x,y,z; x=y= 10; Z= ++x || ++y; printf("x=%d,y=%d,z=%d",x,y,z);
10.如下ISR代码是否有问题?如有问题指出问题点?
# define PI 3.14 interrupt double isr_function (double radius){ double area = Pl * radius* radius; printf("Area = %f", area); return area; }
11.列举出10个Linux操作命令。
12.写出你熟悉的一个嵌入式芯片的型号、性能指标及资源分布情况。
13,画出你最熟悉的一个实践项目的系统框图
14,列举一个你在所做项目中遇到的技术问题,并描述分析问题的思路及最终解决问题的方法。
15.根据如下简易原理图,实现发光二极管的流水灯控制。要求控制方向依次从左到右从上到下。
微恩格科技5/29面试
json格式有什么好处?有没有其他格式可以实现?
1、方便于传输,较少冗余的字符
2、方便转换。有很多的json api提供了json字符串转成对象、对象转换成json串的方法。
3、易于阅读。
其他格式的话:XML
移植了wifi驱动之后应用还要做什么吗?
还要移植wireless tools和wpa_supplicant这两个库
在wpa_supplicant.conf配置文件配置wifi名称和密码
使用命令
wpa_supplicant -D wext -c /etc/wpa_supplicant.conf -i wlan0 &
对mqtt协议有多少了解
⚫ QoS = 0 :最多发一次;
⚫ QoS = 1 :最少发一次;
⚫ QoS = 2:保证收一次;
实现原理是发送PUBLISH报文和应答报文
文件描述符0 1 2分别代表什么
0 标准输入1 标准输出2 标准错误输出
#我的实习求职记录#