嵌入式软件工程师笔试题

1 . 用预处理指令 #define 声明一个常数,用以表明 1年中有多少秒(忽略闰年问题) 
#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL

2 . 写一个 "标准"宏 MIN ,这个宏输入两个参数并返回较小的一个。 
#define MIN(A,B)((A) <= (B) ? (A) : (B)) 

已知一个数组table,用一个宏定义,求出数据的元素个数。
参考答案:#define NTBL
#define NTBL (sizeof(table)/sizeof(table[0]))

3. 预处理器标识 #error的目的是什么?
不知道


4. 嵌入式系统中经常要用到无限循环,你怎么样用 C编写死循环呢? 这个问题用几个解决方案。我首选的方案是: 
while(1) { ?} 
一些程序员更喜欢如下方案: for(;;) { ?}


5. 用变量 a给出下面的定义 
a) 一个整型数( An integer) 
b)一个指向整型数的指针( A pointer to an integer) 
c)一个指向指针的的指针,它指向的指针是指向一个整型数( A pointer to a pointer to an intege)r 
d)一个有 10个整型数的数组( An array of 10 integers) 
e)一个有 10个指针的数组,该指针是指向一个整型数的。( An array of 10 pointers to integers) 
f) 一个指向有 10个整型数数组的指针( A pointer to an array of 10 integers) 
g) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数( A pointer to a function that takes an integer as an argument and returns an integer) 
h)一个有 10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数( An array of ten pointers to functions t hat take an integer argument and return an integer ) 答案是: 
a) int a; // An integer 
b) int *a; // A pointer to an integer 
c) int **a; // A pointer to a pointer to an integer d) int a[10]; // An array of 10 integers 
e) int *a[10]; // An array of 10 pointers to integers 
f) int (*a)[10]; // A pointer to an array of 10 integers 
g) int (*a)(int); // A pointer to a function a that takes an integer argument and returns an integer 
h) int (*a[10])(int); // An array of 10 pointers to functions that take an integer argument and return an integer 


6. 关键字 static的作用是什么? 
这个简单的问题很少有人能回答完全。
在 C语言中,关键字 static有三个明显的作用:
在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。
在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变 量。 
在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。

7.关键字 const有什么含意?
只读
(1)欲阻止一个变量被改变,可以使用const关键字。在定义该const变量时,通常需要对它进行初始化,因为以后就没有机会再去改变它了;
(2)对指针来说,可以指定指针本身为const,也可以指定指针所指的数据为const,或二者同时指定为const;
(3)在一个函数声明中,const可以修饰形参,表明它是一个输入参数,在函数内部不能改变其值;
(4)对于类的成员函数,若指定其为const类型,则表明其是一个常函数,不能修改类的成员变量;
(5)对于类的成员函数,有时候必须指定其返回值为const类型,以使得其返回值不为“左值”

const int a; a是一个常整型数
int const a; a是一个常整型数
const int *a; a是一个指向常整型数的指针
int * const a; a是一个指向整型数的常指针
int const * a const;  a是一个指向常整型数的常指针

8. 关键字 volatile有什么含意 ?并给出三个不同的例子。
一个定义为 volatile的变量是说这变量可能会被意想不到地改变
并行设备的硬件寄存器(如:状态寄存器) 
一个中断服务子程序中会访问到的非自动变量 (Non-automatic variables)
多线程应用中被几个任务共享的变量


9. 嵌入式系统总是要用户对变量或寄存器进行位操作。给定一个整型变量 a,写两段代码,第一个设置 a的 bit 3,第二个清除 a 的 bit 3。
#define BIT3 (0x1 << 3) static int a; 
void set_bit3(void) { a |= BIT3; } 
void clear_bit3(void) { a &= ~BIT3; 
}


10. 嵌入式系统经常具有要求程序员去访问某特定的内存位置的特点。在某工程中,要求设置一绝对地址为 0x67a9的整型变量的值为 0xaa6
int *ptr; 
ptr = (int *)0x67a9;
*ptr = 0xaa55;

11. 中断是嵌入式系统中重要的组成部分,这导致了很多编译开发商提供一种扩展 ―让标准 C支持中断。具代表事实是,产生了一个新的关键 
字__interrupt。下面的代码就使用了 __interrupt关键字去定义了一个中断服务子程序 (ISR),请评论一下这段代码的。 
__interrupt double compute_area (double radius) { 
double area = PI * radius * radius; printf("\nArea = %f", area); return area; } 
这个函数有太多的错误了,以至让人不知从何说起了: 
ISR不能返回一个值。如果你不懂这个,那么你不会被雇用的。 
ISR不能传递参数。如果你没有看到这一点,你被雇用的机会等同第一项。 
在许多的处理器 /编译器中,浮点一般都是不可重入的。有些处理器 /编译器需要让额处的寄存器入栈,有些处理器 /编译器就是不允许在 IS 
R中做浮点运算。此外, ISR应该是短而有效率的,在 ISR中做浮点运算是不明智的。
与第三点一脉相承, printf()经常有重入和性能上的问题。如果你丢掉了第三和第四点,我不会太为难你的。不用说,如果你能得到后两点

12 . 下面的代码输出是什么,为什么? void foo(void) { 
unsigned int a = 6; int b = -20; 
(a+b > 6) ? puts("> 6") : puts("<= 6"); }

 C语言中的整数自动转换原则
当表达式中存在有符号类型和无符号类型时所有的操作数都自动转换为无符号类型。


15 Typedef 在 C语言中频繁用以声明一个已经存在的数据类型的同义字。也可以用预处理器做类似的事。
例如,思考一下下面的例子: 
#define dPS struct s * 
typedef struct s * tPS;


16 . C语言同意一些令人震惊的结构 ,下面的结构是合法的吗,如果是它做些什么? 
int a = 5, b = 7, c; 
c = a+++b; 
就近原则


17 堆栈
int a = 0;全局初始化区
char *p1;全局未初始化区
main()
{
int b;栈
char s[] ="abc";栈
char *p2;栈
char *p3 ="123456"; 123456\0在常量区,p3在栈上。
static int c =0;全局(静态)初始化区
p1 = (char*)malloc(10);
p2 = (char*)malloc(20);分配得来得10和20字节的区域就在堆区。
strcpy(p1,"123456"); 123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。


18 什么是野指针?产生的原因?
“野指针”不是NULL指针,是指向“垃圾”内存(不可用内存)的指针。“野指针”是很危险的,if无法判断一个指针是正常指针还是“野指针”。有个良好的编程习惯是避免“野指针”的唯一方法。
野指针的成因主要有三种:
一、指针变量没有被初始化。指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。
二、指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针。
三、指针操作超越了变量的作用范围。比如不要返回指向栈内存的指针或引用,因为栈内存在函数结束时会被释放。比如说某个地址的生命期,使用一个没有生命期的指针是非常危险的。


19 sizeof和strlen区别
sizeof
sizeof(...)是运算符,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组、指针、类型、对象、函数等。它的功能是:获得保证能容纳实现所建立的最大对象的字节大小。
strlen
strlen(...)是函数,要在运行时才能计算。参数必须是字符型指针(char*)。当数组名作为参数传入时,实际上数组就退化成指针了。
它的功能是:返回字符串的长度

某32位系统下, C++程序,请计算sizeof 的值(5分).
char str[] = “http://www.ibegroup.com/”
char *p = str ;
int n = 10;
请计算
sizeof (str ) = ?(1)
sizeof ( p ) = ?(2)
sizeof ( n ) = ?(3)
void Foo ( char str[100]){
请计算
sizeof( str ) = ?(4)
}
void *p = malloc( 100 );
请计算
sizeof ( p ) = ?(5)
答:(1)25 (2)4 (3) 4 (4)4 (5)4

20
char iArr[10]={0,1,2,3,4,5,6,7,8,9};
short int *pVal = NULL;
pVal = (short int *)(iArr+2);
short int tVal = *pVal;

请问:Intel CPU的计算机中:tVal = ?

char iArr[10]={0,1,2,3,4,5,6,7,8,9};
short int *pVal = NULL;
pVal = (short int *)(iArr+2); //pVal和(iArr+2)都指向数组iArr的的3个元素2的地址
short int tVal = *pVal; //pVal指向的地址的内容(按字节)是:0x02,0x03,0x04,0x05

由于tVal和pVal分别是short类型的变量和指针
而Intel CPU的对short双字节的存放是:高字节在后,低字节在前
所以,tVal=*pVal=0x02+(0x03<<8)=0x0302=77

21 写出strcpy,strcmp,strlen,memcpy函数源码的实现。
char * strcpy( char*strDest, const char *strSrc )
{
assert( (strDest !=NULL) && (strSrc != NULL) );
char *address =strDest;
while( (*strDest++= * strSrc++) !=‘\0’ );
return address;
}

int strlen( const char *str ) //输入参数const
{
assert(strt != NULL); //断言字符串地址非0
intlen;
while( (*str++) !='\0' )
{
len++;
}
return len;
}

内存区域相对位置和重叠关系 //不知道两个指针的类型,不可以这样自加
void* mymemcpy( void *dest, const void *src, size_t count )
{
char *ret;
char *dst_t;
char *src_t;

ret = (char *)dst;


if ((unsigned char*)dst <= (unsigned char*)src|| (unsigned char *)dst >= ((unsigned char *)src + count))
{ //Non-Overlapping Buffers,copy from lower addresses to higher addresse

dst_t = (char *)dst;
src_t = (char *)src;

while (count--)
{
*dst_t++ = *src_t++;
}

}else
{//Overlapping Buffers,copy from higher addresses to lower addresses

dst_t = (char *)dst + count - 1;
src_t = (char *)src + count - 1;

while (count--)
{
*dst_t-- = *src_t--;

}
}

return(ret);
}


int main( void )
{
char str[] = "0123456789";
mymemcpy( str+1, str+0, 9 );
cout << str << endl;

system( "Pause" );
return 0;
}

char * __cdecl strcat (char * dst, const char * src)
{
char * cp = dst;
while( *cp )
cp++; /* find end of dst */
while( *cp++ = *src++ ) ; /* Copy src to end of dst */
return( dst ); /* return dst */
}

int strcmp(char *str1,char *str2)

{

if(*str1==‘\0’||*str2==’\0’) return;

while(*str1!=’\0’&&*str2!=’\0’&&*str1==*str2)

{

str1++;

str2++;

}

if(*str1==*str2)

return 1;

else return 0;

}

}
22 请写一个C函数,判断大小端。
int checkCPU()
{
{
union w
{
int a;
char b;
} c;
c.a = 1;
return (c.b == 1); 小端
}
}

23 与“零值”比较
分别给出BOOL,int,float,指针变量与“零值”比较的 if语句(假设变量名为var)
解答:
BOOL 型变量:if(!var)
int型变量:if(var==0)
float 型变量:
const floatEPSINON = 0.00001;
if ((x >= -EPSINON) && (x <= EPSINON)
指针变量:if(var==NULL)

24 对齐方式
·使用伪指令#pragma pack (n),编译器将按照n 个字节对齐;
·使用伪指令#pragma pack (),取消自定义字节对齐方式。

25 不是使用变量,调换两个变量的值
a = a + b;
b = a - b;
a = a - b;
或者:
a = a ^ b;
b = a ^ b;
a = a ^ b;

26
(1).Void GetMemory(char **p, int num){
*p = (char *)malloc(num);
}
void Test(void){
char *str = NULL;
GetMemory(&str, 100);
strcpy(str, "hello");
printf(str);
}
请问运行Test 函数会有什么样的结果?
答:输出“hello”
(2). void Test(void){
char *str = (char *) malloc(100);
strcpy(str, “hello”);
free(str);
if(str != NULL){
strcpy(str, “world”);
printf(str);
}
}
请问运行Test 函数会有什么样的结果?
答:输出“world”
(3). char *GetMemory(void){
char p[] = "hello world";
return p;
}
void Test(void){
char *str = NULL;
str = GetMemory();
printf(str);
}
请问运行Test 函数会有什么样的结果?
答:无效的指针,输出不确定

转载于:https://www.cnblogs.com/gjianw217/p/5272489.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/573869.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

盐城工学院计算机基础试卷,大学计算机基础及实用软件/大学计算机基础

spContent大学计算机基础及实用软件是人文学院、外语学院、经济学院和管理学院所有专业学生的必修基础课程之一&#xff0c;主要讨论计算机的发展、计算机系统及组成原理、掌握Windows7系统基本操作、熟练掌握Office 2010的基本操作、了解因特网基础与简单应用&#xff0c;本课…

如何用python写脚本_【按键教程】用python写脚本 另附垫材24与变奏22的实现

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 二、脚本中需要些什么 以PE10炮为例 #!/usr/bin/python #对mac/linux用户&#xff0c;可以点击脚本文件即运行 # -*- coding: utf-8 -*- #声明文字编码&#xff0c;在脚本用汉字时必备&#xff0c;全用英文也推荐写上 import thre…

河北体检系统诚信企业推荐_应用多的隔膜计量泵价格诚信企业推荐

应用多的隔膜计量泵价格诚信企业推荐无害化处理&#xff1a;经对标&#xff0c;注意药剂量可以适当降低&#xff0c;能降低药剂量的单位&#xff0c;反之降低。车用齿轮箱定位测量仪与计量泵计量无关&#xff0c;关键在于他们都是直线运动&#xff0c;动力输出的横轴主运动&…

CSS中position的4种定位详解

大家都知道&#xff0c;css中的position有4种取值&#xff0c;分别是static、fixed、relative、absolute。 详细解释&#xff1a; static&#xff1a;相当于没有定位&#xff0c;元素会出现在正常的文档流中。 fixed&#xff1a;元素框的表现类似于absolute&#xff0c;但是fix…

it计算机哪些专业术语,IT之家学院:笔记本电脑专业术语科普

IT之家网友现在为大家整理了一些在笔记本电脑商的专业术语解释&#xff0c;比如触摸屏、触摸板、指纹识别等具体涵义。触摸屏电阻式触摸屏是在强化玻璃表面分别涂上两层OTI 透明氧化金属电层&#xff0c;两层之间用细小的透明隔离点隔开。外层OTI涂层作导电体&#xff0c;内层O…

ideajava目录显示类成员_面试:C++不可继承类

作者&#xff1a;wxquare链接&#xff1a;https://www.cnblogs.com/wxquare/p/7280025.html面试中可能遇到让设计一个无法被继承的类。最简单的实现是将该类的构造函数设置为私有的&#xff0c;然后通过静态成员函数调用私有构造函数实例化对象&#xff0c;这样的类确实不可继承…

c++ 三维数组 初始化_013 JAVA 多维数组及数组的拷贝、冒泡排序、二分法查找...

1.多维数组多维数组的元素又是数组&#xff0c;可以有二维、三维、甚至更多维数组1.1二维数组的声明&#xff1a;数据类型 [][] new 数据类型[一维长度][二维长度]public class Test01 {public static void main(String[] args) {//一维数组的静态初始化 数据类型[] 数组名 …

js工具类

<tr><th>适用范围说明&#xff1a;</th><td colspan"5"> <textarea class"text" id"dtoinstrutcation" name"productScopeDTO.instrutcation" wrap"PHYSICAL" Null"true" rows"2…

自考计算机成绩,自考成绩计算机中是什么意思?

你说电脑是什么意思&#xff1f;计算机等级考试有两种&#xff0c;一种是全国高校计算机水平考试(CCT)&#xff0c;另一种是全国计算机等级考试(NCRE)。你对这两种测试了解多少&#xff1f;1什么是CCT&#xff1f;CCT的全称是“全国高校计算机水平考试”&#xff0c;让人感觉像…

httpservletrequest 设置请求头_请求和常用对象

## 一、主要内容![](https://raw.githubusercontent.com/Cushier/picture-java/master/middle/20190712150414.png)## 二、核心目标理解几个常用对象的意义和作用掌握几种请求的发出方式掌握数据的发送和接收方式掌握跳转方式掌握乱码的解决## 三、请求的方式要访问服务器首先需…

Jmeter文章索引贴

一、基础部分&#xff1a; 使用Jmeter进行http接口测试Jmeter之Http Cookie ManagerJmeter之HTTP Request DefaultsJmeter之逻辑控制器(Logic Controller)Jmeter属性和变量Jmeter组件执行顺序与作用域Jmeter参数化Jmeter关联Jmeter分布式测试Jmeter代理录制脚本Jmeter调试工具-…

from mysql partition select_爬虫(九十九)mysql详解二

**mysql中字段的常见类型: **二进制位 bit(长度)tinyint[(长度)] [有无符号unsigned] [位数低于长度时候是否填充零zerofill] 有符号表示范围-128 ~ 127, 无负号表示范围 0 ~ 255; 可用tinyint(1)来模拟boolean类型; *整型中的长度不做限制用, 仅仅做显示用, 即长度大于位数时候…

服务器训练数据 关闭终端,一文明白使用nohup将服务器训练程序后台运行不关闭+随时通过查看训练情况输出与visdom可视化...

使用nohup将训练程序后台不间断运行随时查看训练情况输出与可视化使用服务器进行远程训练由于笔者经常需要使用服务器进行训练&#xff0c;且有些模型训练起来需要很长的时间&#xff0c;如Mask模型&#xff0c;故经常需要长期跑程序。由于我使用的是ssh登录&#xff0c;因此断…

v-for 获取数组key value_Vue之路 | 05von、vif、vfor

点击左上方“熊吱”关注我们吧&#xff01;1事件监听在开发中&#xff0c;需要监听用户发生的事件&#xff0c;如点击、拖拽、键盘操作等&#xff0c;在Vue中&#xff0c;使用v-on指令绑定事件监听器。v-on的语法糖为&#xff1a;v-on基本操作在下面代码中&#xff0c;使用了v-…

华为:明明的随机数

明明的随机数明明想在学校中请一些同学一起做一项问卷调查&#xff0c;为了实验的客观性&#xff0c;他先用计算机生成了N个1到1000之间的随机整数&#xff08;N≤100&#xff09;&#xff0c;对于其中重复的数字&#xff0c;只保留一个&#xff0c;把其余相同的数去掉&#xf…

c++输出txt格式循环一组数据后换行再循环一次_numpy、pandas以及用pandas做数据分析的案例...

本文也是秦路老师python教程的学习笔记。这篇也是发给超哥看的&#xff1a;很多人说python很简单很好学&#xff0c;也有很多人说python没有java和c的功能强大。但是这都不重要&#xff0c;重要的是我们想学了&#xff0c;想画图也好做数据分析也罢&#xff0c;想学了就直接开始…

国内qq邮箱服务器,qq邮箱的服务器在国内吗(注册qq邮箱的服务器是什么)

2006年11以前的163用户&#xff0c;可以使用pop功能&#xff0c;以后申请的就不行了&#xff0c;楼主要是是后来申请的&#xff0c;你就别指望能用pop功能了&#xff0c;换邮箱吧&#xff0c;gmail.com &#xff0c;或者qq邮箱也可以的。。邮箱地址是有个人喜好起名的&#xff…

python支持向量机回归_机器学习实战-支持向量机原理、Python实现和可视化(分类)...

支持向量机&#xff08;SVM&#xff09;广泛应用于模式分类和非线性回归领域。 SVM算法的原始形式由Vladimir N.Vapnik和Alexey Ya提出。自从那以后&#xff0c;SVM已经被巨大地改变以成功地用于许多现实世界问题。 1.什么是支持向量机&#xff08;SVM&#xff09;&#xff1f;…

ajax保存乱码,Ajax 乱码详细

前面说了 Ajax 乱码的原因&#xff0c;以及解决乱码的示例&#xff0c;下面来个全面的分析。XMLHTTP 返回的数据默认的字符编码是 UTF-8&#xff0c;如果前台页面是 GB2312 或者其它编码数据就会产生乱码。POST 方法提交数据默认的字符编码是 UTF-8&#xff0c;如果后台是 GB23…

gin context和官方context_Go语言gin框架从入门到精通(3)

gin的渲染1 各种数据格式的响应json、结构体、XML、YAML类似于java的properties、ProtoBuf分别对所有数据格式举个列子func main() {r : gin.Default() ​//1. json响应r.GET("/someJSON", func(c *gin.Context) {c.JSON(200,gin.H{"message":"someJS…