首页 > 编程知识 正文

嵌入式软件工程师笔试题库(校招硬件工程师笔试题)

时间:2023-05-04 07:58:19 阅读:74231 作者:2878

嗨,大家都很好。 今天分享万亿易创新嵌入式软件开发工程师笔试的主题。 这个题目难度中等,多考察基础知识,最后的编程问题只考了一个结构体数组的初始化。 所以,准备学校的时候,要把重点放在基础知识上。 看了这个主题能回答几分呢?

本文已同步更新在github,点击跳转。希望大家能给个star支持下!

文章目录单选题简答编程问题

选择问题

1.Linux中使用 mkdir命令创建新的目录时,在其父目录不存在时先创建父目录的选项是()

A -m

B -d

C -f

D -p

d

mkdir [选项] [目录]

在-m --mode=模式下,创建目录时同时设置目录权限。

-p --parents创建当前未创建的上级目录,同时创建上级目录。

每次创建新目录时,-v --verbose都会显示信息。

- h--帮助信息。

2.下面代码创建了多少个进程(不包含main进程本身)()

intmain(intargc,char* argv[] ) { fork ); fork () fork )|| fork ); fork (; } A 19

B 30战斗机

C 24

D 29

a

这个问题主要考了两个知识点。 一是逻辑运算符执行的特点; 第二个是对福克斯的理解。

cond1 cond2 || cond3代码是如何运行的?

1、cond1为假时,不判断cond2。 接着判断cond3。

2、cond1为真,这又要分为两种情况。

2.1如果cond3为真,则无需判断cond3。

2.2如果cond3为假,也必须判断cond3。

fork调用的一个妙处是只能调用一次,可以返回两次。 返回值可能有三个不同的值。

1、在父进程中,fork返回新创建的子进程的进程ID。

2、在子进程中,fork返回0。

3、发生错误时,fork返回负值。 (我用标题说明了不用考虑这种情况。

如果在fork函数执行完成后成功创建了新进程,则会显示两个进程:子进程和父进程。 在子进程中,fork函数返回0,而在父进程中返回新创建的子进程的进程ID。 从fork返回的值可以确定当前进程是子进程还是父进程。

有了以上知识,让我们分析一下fork(fork )|| fork )是否会创建一些新流程。

很明显,fork(fork )|| fork )创建了四个新进程。

总结:

第一行fork生成一个新进程。

第二行中的三个fork生成4=8的新进程。

第三行的fork将生成10个新进程。 (这是因为前面总共有10个进程,一次fork调用将生成10个新进程。

因此,将生成一个总长度为1 8 10=19的新进程。

3.如果下列公式成立:3A*124=446C。则采用的是()进制

A 11

B 12

C 14

D 16

C

看座位。 最后的结果是446C个比特为c,所以a、b可以排除。

假设为十四进制,(A * 4)=12,结果正好为c。 因此,答案是十四进制。

4.下面关于字符数组的初始化,那个是正确的?()

A char b[2][3]={'d '、' e '、' f'};

B char b[2][3]={'d ',' e'};

Cchar b[2][3]={{'d ',' e ',' f'},{'a ',' b ',' c'};

Dchar b[2]={'d ',' e'};

B

二维数组的每一行通常用一个字符串初始化。 例如:

char c[3] [8]={{'apple'},{'orange'},{'banana'}};

等效于:

char c[3][8]={'apple '、' orange '、' banana'};

A:表示char b[3][2]={'d '、' e '、' f'};

C:是char b[2][3][2]={{'d '、' e '、' f'}、{'a '、' b '、' c'};

D:表示char b[2][2]={'d ',' e'};

5.在32位系统中,下列类型占

用8个字节的为()

A int

B unsigned long long

C char

D short int

B

32位操作系统

int:4字节

unsigned long long:8字节

char :1字节

short int:2字节

注意和64位操作系统的区别:64位系统中,指针变量和long以及unsigned long 都占8个字节,其他的和32位系统一样

简答

1.

int a[6] = {1,2,3,4,5,6};printf("%dn",*((int*)(&a+1)-1));

那么打印结果是什么?

6。

将 *((int*)(&a+1)-1))化简为:*(p-1)和 p=(int*)(&a+1)

&a是一个指向int(*)[6]的指针。由于&a是一个指针,那么在32位机器上, sizeof(&a)=4,但是**&a+1的值取决于&a指向的类型**,由于&a指向

int(*)[6],所以&a+1 = &a + sizeof(int(*)[6])=&a+24。&a是数组的首地址,由此&a+1表示a向后移动了6个int从而指向a[6](越界),所以p指向的是a[6]。

由于p是int * 类型,那么p-1就指向a[5],所以 *(p-1)=a[5]=6。

2.请写出常量指针和指针常量的代码形式,并简述他们的区别

int const *p1;const 在前,定义为常量指针

int *const p2; * 在前,定义为指针常量

常量指针p1:指向的地址可以变,但内容不可以重新赋值,内容的改变只能通过修改地址指向后变换。

指针常量p2:指向的地址不可以重新赋值,但内容可以改变,必须初始化,地址跟随一生。

3.如何避免头文件被重复包含

条件编译: #ifndef _HEADERNAME_H#define _HEADERNAME_H...//(头文件内容)#endif #pragma once

指定当前文件在构建时只被包含(或打开)一次,这样就可以减少构建的时间,因为加入#pragma once后,编译器在打开或读取第一个#include 模块后,就

不会再打开或读取随后出现的相同#include模块。

4.运行char name[] = "/dev/spdev"后,系统会分配几块内存,这些内存共占多少个字节?

11字节。

字符串最后以结尾,共占据11字节。

5.如下代码,请设计宏定义STR(x),将USART_RATE转换成字符串并打印出来

#define USART_RATE 115200#define STR(x)____?printf("usart rate = %sn",STR(USART_RATE));

#define STR(x) #x

#:会把参数转换为字符串

6.已知结构体成员d的地址为p1,请获取成员变量b的地址。

struct data{int a;char b;short c;short d;int e;};

p1 - 4 * sizeof(p1)

结构体中成员变量在内存中存储的其实是偏移地址。也就是说结构体的首地址+成员变量的偏移地址 = 结构体成员变量的起始地址。具体如下图所示。

因此,将指针p1向上移动4个单位即可。即p1-4 * sizeof(p1)

7.请写出下列代码的输出结果

int main(int argc,char *argv[]){char *buff[] ={"char","int","double"};printf("%cn",*(buff+1)[1]);return 0;}

d

buff是指针数组 ,一个3个元素的数组,数组里面是个字符串指针,这里执行buff+1时,则buff指向下一个数组元素,即int。

因此,*(buff+1)[0]指向int的地址,*(buff+1)[1] 指向double的地址,而最后是输出一个字符。所以,输出d。

8.下面的代码输出什么?为什么?

void foo(void){unsigned int a = 6;int b = -20;(a+b>6)?puts(">6"):puts("<=6");}

>6

C中运算有规定,如果整型变量间进行数据运算,只要有一个变量是无符号的,结果就按无符号数据输出,因此a+b > a
结果会输出 >6

编程题

表一:人员信息表:(info_table)

序号(num)姓名(name)性别(gender)年龄(age)0成就的毛豆(清脆的发卡)男(man)601fdmt(ssdsh)男(man)302妩媚的大象(Colin)女(woman)56

表二:人员职业表:(work_table)

序号(num)姓名(name)职业(work)等级(level)0成就的毛豆(清脆的发卡)司机(driver)91fdmt(ssdsh)厨师(chief)32妩媚的大象(Colin)幼师(teachers)6

表三:技能成绩表:(grade_table)

序号(num)姓名(name)技能(skill)成绩(grade)0成就的毛豆(清脆的发卡)开车(drive)501fdmt(ssdsh)烹饪(cook)642妩媚的大象(Colin)教学(teaching)55

如上所示有人员-职业-成绩的三个关系表

请尝试

1.使用结构体表示三个表格。

2.设计一个函数来依次录入人员信息

如add_personnel(info_table,work_table,grade_table);

/* * @Description: 兆易创新编程题 * @Version: * @Autor: 公众号【嵌入式与Linux那些事】 * @Date: 2021-04-03 21:46:16 * @LastEditors: 公众号【嵌入式与Linux那些事】 * @LastEditTime: 2021-04-03 22:03:38 */#include <stdio.h>//人员信息表typedef struct info_table{ char name[6]; char gender[5]; int age;}INFO;//人员职业表typedef struct work_table{ char name[6]; char work[10]; int level;}WORK;//技能成绩表typedef struct grade_table{ char name[6]; char skill[10]; int grade;}GRADE;/** * @Description: 依次录入人员信息 * @param {INFO} *pinfo * @param {WORK} *pwork * @param {GRADE} *pgrade * @Return: 无 * @Author: 公众号【嵌入式与Linux那些事】 */void add_personnel(INFO *pinfo,WORK *pwork,GRADE *pgrade){ int i; for(i = 0;i < 3;i++){ printf("请依次输入第%d个人的信息:姓名,性别,年龄n",i+1); scanf("%s%s%d",pinfo[i].name,pinfo[i].gender,&pinfo[i].age); printf("%s,%s,%dn",pinfo[i].name,pinfo[i].gender,pinfo[i].age); } for(i = 0;i < 3;i++){ printf("请依次输入第%d个人的信息:姓名,职业,等级n",i+1); scanf("%s%s%d",pwork[i].name,pwork[i].work,&pwork[i].level); printf("%s,%s,%dn",pwork[i].name,pwork[i].work,pwork[i].level); } for(i = 0;i < 3;i++){ printf("请依次输入第%d个人的信息:姓名,技能,成绩n",i+1); scanf("%s%s%d",pgrade[i].name,pgrade[i].skill,&pgrade[i].grade); printf("%s,%s,%dn",pgrade[i].name,pgrade[i].skill,pgrade[i].grade); }}int main(){ INFO info_array[3]; WORK work_array[3]; GRADE grade_array[3]; add_personnel(info_array,work_array,grade_array); return 0;}

今天的题目就分享到这里,关于题目,有任何疑问都可以私信我。下一篇文章,将会分享大厂的笔试题目解析。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_16933601/article/details/115752750

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。