企业真题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三次握手和四次挥手的过程

使用多进程实现并发设计一个通信协议

  1. 定义通信协议:首先需要定义通信协议,包括消息格式、消息类型和处理规则等。这是协议的基础,也是进程之间交互的基础。
  2. 创建进程和管道:使用fork()函数创建多个进程,使用pipe()函数创建多个管道。
  3. 在每个进程中,通过管道来实现进程间的通信:进程之间可以通过管道来进行双向通信,一个进程通过管道发送数据,另一个进程通过管道接收数据。
  4. 使用select()函数实现多路复用:可以使用select()函数来实现多路复用,这样每个进程都可以同时监听多个管道。
  5. 处理数据:每个进程从管道读取数据后,可以根据数据类型进行相应的处理。可以使用类似于消息队列的方式,在管道中传输数据。
#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向两个子进程发送数据。三个进程之间的通信通过两个管道进行。这样,就实现了三个进程间的并发通信。

在多进程并发通信协议中,使用管道作为进程间通信方式的原因主要有以下几点:

  1. 管道是最简单的进程间通信方式之一,只需要使用两个文件描述符就能完成进程之间的双向通信。
  2. 管道是半双工的,只能单向传输数据,但是可以通过创建两个管道来实现双向通信。
  3. 管道是基于文件的通信方式,可以使用类似于文件操作的方式来进行数据的读取和写入,使用起来非常方便。
  4. 管道可以使用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协议有什么区别

  1. 用途不同:HTTP协议是一种应用层协议,常用于客户端与服务器之间的数据传输,例如浏览器请求网页、下载文件等;MQTT协议是一种轻量级消息协议,主要用于物联网设备之间的消息传递。
  2. 通信方式不同:HTTP协议采用的是请求-响应模式,即客户端向服务器发送请求,服务器返回响应;MQTT协议则是发布-订阅模式,客户端可以发布消息到服务器,其他客户端可以订阅这些消息并接收到。
  3. 数据格式不同:HTTP协议传输的数据格式一般为HTML、JSON等文本格式;MQTT协议传输的数据格式一般为二进制格式,可以自定义。
  4. 网络传输方式不同:HTTP协议使用的是TCP协议,因此数据传输比较可靠,但是对于实时性要求较高的应用场景,可能会存在延迟等问题;MQTT协议可以使用TCP或UDP协议,具有轻量级、低开销的优势,在网络质量不好的情况下能够更好地保证消息的传输效率和实时性。
  5. 安全性不同:HTTP协议可以使用HTTPS协议来加密数据传输,保证通信安全;MQTT协议也提供了TLS/SSL加密方式,但相对来说在安全性方面可能没有HTTP协议那么高。

MQTT协议哪一种qos等级对带宽影响最大

  1. QoS等级为0:最简单、带宽消耗最小的一种等级,消息只需要被发送一次,不需要确认,不保证可靠传输。
  2. QoS1级别:当发布者发布一条消息时,它会在等待收到确认(ACK)后才会继续进行后续操作。接收方在收到一条消息后,会回复一个ACK消息告知发送方收到了该消息。如果发送方在一定时间内没有收到ACK,它会重新发布消息,直到接收方返回ACK消息。这种级别可以保证消息至少传输一次,但可能会重复传输。
  3. 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 标准错误输出

#我的实习求职记录#
全部评论

相关推荐

4 10 评论
分享
牛客网
牛客企业服务