-
华为嵌入式系统面试题
(
1
)什么是预编译,何时需要预编译:
答案:
1、总是使用不经常改动的大型代码体。
2、
程序由多个模块组成,
所有模块都使用一组标准的包含文件和相同的编译选
项。在这种情况下,
可以将所有包含文件预编译为一个预编译头。
(
2
)
char *
const p
char const * p
const char *p
上述三个有什么区
别?
答案:
char * const p; //
常量指针,
p
的值不可以修改
char const * p
;
//
指向常量的指针,指向的常量值不可以改
const char *p
;
//
和
char const *p
(
3
)
p>
char str1[] =
=
*str8 =
< < ( str5 == str6 )
< < endl; cout < < ( str7 == str8 ) < < endl;
结果是:
0
0
1
1
str1,str2,str
3,str4
是数组变量,它们有各自的内存空间;而
str5
,str6,str7,str8
是指针,它们指向相同的常量区域。
< br>
(
4
)以下代码中的两个
sizeof
用法有问题吗?
[C
易
]
void
UpperCase(
char
str[]
)
//
将
str
中的小写字母转换成大写字母
{
for(
size_t
i=0;
i
++i
)
if(
'a'
<=str[i]
&&
str[i] <='z' )
str[i] -= ('a'-'A' ); }
char str[] =
字符
长度为
:
< < str < <
endl;
答案:函数内的
sizeof
有问题。根据语法,
sizeof
如用于数组,只能测出静
态数组的大
小,无法检测动态分配的或外部数组大小。
函数外的
str
p>
是一个静态
定义的数组,因此其大小为
6<
/p>
,因为还有
'0'
,函数内的
str
实际只是一个指向字
符串的指针,
没有任何额外的与数组相关的信息,
因此
siz
eof
作用于上只将其当
指针看,一个指针为
< br>4
个字节,因此返回
4
。
(
5
)一个
32
位的机器
,<
/p>
该机器的指针是多少位答案:
指针是多少位只要看地址总线的位数就行了。
80386
以后的机子都是
32
的
数据
总线。所以指针的位数就是
4
个字节了。
6
。
main()
{
int
a[5]={1,2,3,4,5};
int
*ptr=(int
*)(&a+1);
pri
ntf(
答案:
2
。
< br>5 *(a+1
)就是
a[1]
,
*(ptr-1)
就是
a[4],<
/p>
执行结果是
2
,
5 &a+1
不是首地址
+1
,
系统会认为加一个
a
数组的偏移,
是偏移
了一个数组的大小
(本例是
5
个
int
)
int *ptr=(int *)(&a+1);
则
ptr
实际是
&(a[5]),<
/p>
也就是
a+5
原因如下:
&a
是数组指针,其类型为
int
(*)[5];
而指针加<
/p>
1
要根
据指针类型加上一定的值,不同类
型的指针
+1
之后增加的大小不同
<
/p>
a
是长度为
5
的
int
数组指针,
所以要加
5*sizeof(int)
所以
ptr
实际是
a[5]
但是
prt
与
(&a+1)
类型是不一样的
(
这点很重要
)
所以
prt-1
只会减去
p>
sizeof(int*) a,&a
的地址是一样
的,但意思不一样,
a
是数组首地址,也就是
a[0]
的地址,
&a
是对象(数组)首
地址
,
a+1
是数组下一元素的地址,即
a[1],&a+1
是下一个对象的地址,即
a[5].
7
、请问以下代码有什么问题:
int
main()
{
char a;
char *str=&a;
strcpy(str,
printf(str);
return 0;
}
答案:没有为
< br>str
分配内存空间,将会发生异常。问题出在将一个字符串复制
进一个字符变量指针所指地址。
虽然可以正确输出结果,
但因为越界进行内在读
写而导致程序崩溃。
8
、
char*
s=
有什么错?
答案:
是字符串常量。
s
是指针,
指向这个字符串常量,所以声明
s
的时候就有问题。
cosnt char* s=
然后又因为是常
量,
所以对是
s[0]
的赋
值操作是不合法的。
9
、写一个“标准”宏,这个宏输入两个参数并返回较小的一个。
答案:
.#define Min(X, Y)
((X)>(Y)?(Y):(X))
//
结尾没有‘;
’
10
、嵌入式系统中经常要用到无限循环,你怎么用
C
编写死循环。
答案:
while(1){}
或者
for(;;)
11
、关键字
static
的作用是什么?
答案:定义静态变量
12
、关键字
const
有
什么含意?
答案:表示常量不可以修改的变量。
13
、关键字
volatile
有什么含意?并举出三个不同的例子?
答案
:提示编译器对象的值可能在编译器未监测到的情况下改变。
14
、
int
(*s[10])(int)
表示的是什么啊?
答案:
int (*s[10])(int)
函数指针数组,每个指针指向一个
int func(int
param)
的函数。
15
。有以下表达式:
int a=248;
b=4;
int const c=21;
const int *d=&a;
int *const e=&b;
int const
*f const =&a;
请问下列表达式哪些会被编译器禁止?为什么?
答案:
*c=32;d=&b;*d=43;e=34;e=&a;f=0x
321f; *c
这是个什么东东,禁止
*d
说
了是
const
,
禁止
e = &a
说了是
const
禁止
const *f const
=&a;
禁止
< br>16
交换两个变量的值,不使用第三个变量。即
a=3,
b=5,
交换之后
a=5,b=3;
答案:
有两种解法
,
一种用算术算法
,
一种用
^(
异或
) a = a + b; b = a
- b; a = a
- b; or a = a^b;//
只能对
int,char.. b = a^b; a =
a^b; or a ^= b ^= a;
17.c
p>
和
c++
中的
st
ruct
有什么不同?
答案:
c
和
c++
中
struct
的主要区别是
c
中的
struct
不可以含有成员函数,
而
c++
中的
struct
可以。
c++
中
struct
和
class
的主要区
别在于默认的存取权限不同,
struct
默认为
public
,而
class
默认为
private
18.
#include
#include
void
getmemory(char *p)
{
p=(char *) malloc(100);
strcpy(p,
}
int main( )
{
char *str=NULL;
getmemory(str);
printf(
free(str);
return 0;
}
答案
:程序崩溃,
getmemory
中的
malloc
不能返回动态内存,
free
()对
str
操作很危险
p>
19.
char szstr[10];
strcpy(szstr,
产生什么结果?为什么?
答案:
长度不一样,会造成非法的
OS
<
/p>
20.
列举几种进程的同步机制,并比较其优缺点。
答案:
原子操作
信号量机制
自旋锁
管程,会合,分布式系统
21.
进程之间通信的途径
答案:共享存储系统消息传递系统管道:以文件系统为基础
22.
进程死锁的原因
答案:资源竞争及进程推进顺序非法
23.
死锁的
4
个必要条件
答案:互斥、请求保持、不可剥夺、环路
24.
死锁的处理
答案:鸵鸟策略、预防策略、避免策略、检测与解除死锁
25.
操作系统中进程调度策略有哪几种?
答案:
FCFS(
先来先服务
)
,优先级,时间片轮转
,多级反馈
26.
类的静态成员和非静态成员有
何区别?
答案:类的静态成员每个类只有一个,非静态成员每个对象一个
27.
纯虚函数如何定义?使用时应
注意什么?
答案:
virtual
void f()=0;
是接口,子类必须要实现
28.
数组和链表的区别
答案:
数组:数据顺序存储,固定大小
链表:数据可以随机存储,大小可
动
态改变
的
七层模型是什么?
tcp/udp
是属于哪一层?
tcp/udp
有何优缺点?
答案:
应用层表示层会话层运输层网络层物理链路层物理层
tcp
/udp
属于运
输层
TCP
服务提供了数据流传输、可靠性、有效流控制、全双工
操作和多路复
用技术等。与
TCP
不同,
UDP
并不提供对
IP
< br>协议的可靠机制、流控制以及
错误恢复功能等。由于
UDP
比较简单,
UDP
头包含很少的字节,比
TCP
负
载消耗少。
tcp:
提供稳定的传输服务,有流量控制,缺点是包头大,
冗余性不
好
udp:
不提供稳定的服务,包头小,开销小
30
:
(void *)ptr
和
(*(void**))ptr<
/p>
的结果是否相同?其中
ptr
为同一个指
针
答案:
.(void *)ptr
和
(*(void**))ptr<
/p>
值是相同的
31
:
int main()
{
int
x=3;
printf(
return 1;
}
问函数既然不会被其它函数调用,为什么要返回
1
?
答案:
mian
中,
c
标准认为
0
表示成功,非
0
表示错误。具体的值是某中具
体出错信息
32
,
要对
绝对地址
0x100000
赋值,
我们
可以用
(unsigned int*)0x100000
= 1234;
那么要是想让程序跳转到绝对地址是
0x10
0000
去执行,应该怎么做?
答案:
*((void (*)( ))0x100000 )
( );
首先要将
0x100000
强制转换成函数指针
,
即
:
(void (*)())0x100000
然后再调用它
:
*((void (*)())0x100000)();
用
typedef
可以
看得更直观些
:
typedef void(*)() voidFuncPtr;
*((voidFuncPtr)0x100000)();
33
,
已知一个数组
table
p>
,
用一个宏定义,
求出数据的元素个数答案
:
#define NTBL
#define NTBL
(sizeof(table)/sizeof(table[0]))
34
、线程与进程的区别和联系
?
线程是否具有相同的堆栈
?
dll<
/p>
是否有独立的堆
栈
?
答案:
进程是死的,
只是一些资源的集合,
真正的程序执行都是线程来完成
的,
程序启动的时候操作系统就帮你创建了一个主线程。每个线程有自己的堆
栈
。
DLL
中有没有独立的堆栈,这个问题不好回答,或者说这个问题本身是
否有问题
。因为
DLL
中的代码是被某些线程所执行,只有线程拥有堆栈
,如
果
DLL
中的代码是
EXE
中的线程所调用,那么这个时候是不是说这个
DLL
没有自己独立的堆栈?如果
DLL
中的代码是由
DLL
自己创建的线程所执行,
那么是不是说
DLL
有独立的堆栈?以上讲的是堆栈,
如果对于堆来说,每个
DLL
有自己的堆,所以如果是从
DLL
中动态分配的内存,最好是从
DLL<
/p>
中删
除,如果你从
DLL
中分配内存,然后在
EXE
中,或者另外一个
DLL
中删除,
很有可能导致程序崩溃
35
、
unsigned short A = 10;
printf(
char
c=128;
printf(
输出多少?并分析过程
答案:第一题,~
A
=
0xfffffff5,int
值
为-
11
,但输出的是
uin
t
。所以输出
4294967285
第二题,
c
=
0x10,
输出的是
int
,最高位为
1
,是负数,所以它的值
就是
0x00
的补码就是
128
,所以输出-
128
。这两道题都是在考察二进制向
int
或
uint
转换时的最高位处理。
p>
(二)
1. -1,2,7,28,,126
请问
28
和
126
中间那个数是什么?
为什么?
答案:第一题的答案应该是
4^3-1=63
规律是
n^3-1(
当
n
p>
为偶数
0
,
2
p>
,
4)
n^3
+1(
当
n
为奇数
1
,
3
,
5)
2.
用两个栈实现一个队列的
功能?要求给出算法和思路!
答案:
设
2
个栈为
A,B,
一开始均为空
.
入队
:
将新元素
push
入栈
A;
出队
: (1)
判断栈
B
是否为空;
(2)
如果不为空,则将栈
A
中所有元素依次
pop
出并
push
到栈
B
;
(
3)
将栈
B
的栈顶元素
pop
出;这样实现的队列入队和出队的平摊复杂
度都
还是
O(1),
比上面的几种方法要好。
3.
在
c
语言库函数中
将一个字符转换成整型的函数是
atol()
吗,这个函数的原
型
是什么?
答案:函数名
: atol
功
能
:
把字符串转换成长整型数
用
法
:
long atol(const
char *nptr);
程序例
: #include
char
*str
=
l
=
atol(lstr);
printf(
=
%s
integer
=
%ldn
str,
l);
return(0); }
4
p>
。对于一个频繁使用的短小函数
,
在
C
语言中应用什么实现
,
在
C++
中应用什么
实现
?
答案:
c
用宏定义,
c++
用
inline
5
。直接链接两个信
令点的一组链路称作什么
?
答案:
PPP
点到点连接
7
。软件测试都有那些种类
?
答案:黑盒:针对系统功能的测试
白合:测试函数功能,各函数接口
8
。确定模块的功能和模块的接口是在软件设计的那个队段完成
的
?
答案:概要设计阶段
9
。
enum string
{
x1,
x2,
x3=10,
x4,
x5,
}x;
问
x
;
p>
答案:取值在
0
。
1
。
10
。
1
1
。
12
中的一个
10
。
unsigned char *p1;
unsigned long *p2;
p1=(unsigned char *)0x801000;
p2=(unsigned long *)0x810000;
请问
p1+5=
;
p2+5=
;
答案:
801005
;
810014
。不要忘记
了这个是
16
进制的数字,
p2
要加
20
变
为
16
进制就是
14
选择题
:
net
链
接
到
Internet
用
到
以
下
那
个
协
议
?
;;;;
2.
属于网络层协议的是
:
;;;D.X.25
s
消息调度机制是
:
A.
指令队列
;B.
指令堆栈
;C.
消息队列
p>
;D.
消息堆栈
;
答案:
b
,
a
,
c
四
.
找错题
:
1.
请问下面程序有什么错误
?
int a[60][250][1000],i,j,k;
for(k=0;k <=1000;k++)
for(j=0;j <250;j++)
for(i=0;i <60;i++)
a[i][j][k]=0;
答案:把循环语句内外换一下
2
。以下是求一个数的平方的程序<
/p>
,
请找出错误
:
#define SQUARE(a)
((a)*(a))
int a=5;
int b;
b=SQUARE(a++);
答案:这个没有问题,
s
(
a
++)
,就是(
p>
(
a
++)×(
a
++)
)唯一要注意的
就是计算后
p>
a
=
7
了
3
、
typedef unsigned char BYTE
int examply_fun(BYTE
gt_len; BYTE *gt_code)
{
BYTE *gt_buf;
gt_buf=(BYTE
*)MALLOC(Max_GT_Length);
......
if(gt_len>Max_GT_Length)
{
return GT_Length_ERROR;
}
.......
}
答案:要释放内存问答题
:
Phone
的原理是什么
?
答案:
IPV6 /IP
通信
建立的过程怎样,
端口有什么作用?答案:
三次
握手,
确定是哪个应用程序使用
该协议
(三)
1
、局部变量能否和全局变量重名?
答案:能,局部会屏蔽全局。要用全局变量,需要使用
局部变量可以与
全局变量同名,
在函数内引用这
个变量时,
会用到同名的局部变量,
而不会用到
全局变量。
对于有些编译器而言,
在同一个函数内可以
定义多个同名的局部变量,
比如在两个循环体内都定义一个同名的局部变量,
而那个局部变量的作用域就在
那个循环体内
2
、如何引用一个已经定义过的全局
变量?
答案:
extern
可以用引用头文件的方式,也可以用
extern
关键字,如果用引
用头文件方式来引用某个在头文件中声明的全局变理,假定你将那
个变写错了,
那么在编译期间会报错,如果你用
extern<
/p>
方式引用时,假定你犯了同样的错误,
那么在编译期间不会报错,
而在连接期间报错
3
、全局变量可不可以定义在可被多个
.C
文件包含的
头文件中?为什么?
答案:可以,在不同的
< br>C
文件中以
static
形式来
声明同名全局变量。可以在
不同的
C
文
件中声明同名的全局变量,前提是其中只能有一个
C
文件中对此
变
量赋初值,此时连接不会出错
4
、语句
for(
;
1
;
)<
/p>
有什么问题?它是什么意思?
答案:和
while(1)
相同。
5
、
do<
/p>
……
while
和
while
……
do
有什么区别?<
/p>
答案:前一个循环一遍再判断,后一个判断以后再循环。
6
、请写出下列代码的输出内容
#
include
main()
{
int a,b,c,d;
a=10; b=a++;
c=++a;
d=10*a++;
printf(
,
< br>c
,
d
:
%d
,
%d
,
%d
,
b
,
c
,
d
)
;
return 0;
}
答
案<
/p>
:
10
,
12<
/p>
,
120
a=10;
b=a++;//a=11
b=10
c=++a;//a=12
c=12
d=10*a++;//a=13 d=120
高级题
1
、
static
全局变量与普通的全局变量有什么区别?
static
局部
变量和普通局部变
量有什么区别?
static
函数与普通函数有什么区别?
答案:全局变量
(
外部变量
)
的说明
之前再冠以
static
就构成了静态的全局变
量。
全局变量本身就是静态存储方式,
静态全局变量
当然也是静态存储方式。
这
两者在存
储方式上并无不同。
这两者的区别虽在于非静态全局变量的作用域是整
< br>个源程序,
当一个源程序由多个源文件组成时,非静态
的全局变量在各个源文
件中都是有效的。而静态全局变量则限制了其作用域,
即只在定义该变量的源
文件内有效,
在同一源程序的其它源文件中不能使用它。由于静态全局变量的
作用域局限于一个源文件内,
只能为该源文件内的函数公用,
因
此可以避免在其
它源文件中引起错误。从以上分析可以看出,
把局部变量改变为静态变量后是
改变了它的存储方式即改变了它
的生存期。
把全局变量改变为静态变量后是改变
了它的作用域,
限制了它的使用范围。
static
函数与普通函数作用域不同。仅在
本文件。只在当前源文件中使用的函数应该说明为内部
函数
(static)
,内部函数应
该
在当前源文件中说明和定义。
对于可在当前源文件以外使用的函数,
应该在一
个头文件中说明,
要使用这些函数的源文件要包含
这个头文件
static
全局变量与
普通的全局变量有什么区别:
static
全局变量只初使化一次,防止在其他文件单
元中被引用
;
static
局部变量和普通局部变量有什么区别:
static
局部变量只被初
始化一次,下一次依
据上一次结果值;
static
函数
与普通函数有什么区别:
static
函数在内存中只有一份,
普通函数在每个被调用中维持一份拷贝
2
、程序的局部变量存在于()中,全局变量存在于()中,动态申请数据存在
p>
于(
)中。
答案:
栈;静态区;堆
3
、设有以下说明和定义:
typedef union {long i; int
k[5];
char c;
}
DATE;
struct data { int
cat; DATE cow; double dog;} too;
DATE max;
则语句
printf(
的执行结果是:
______
< br>答案:
DATE
是一个
unio
n,
变量公用空间
.
里面最大的变量类型是
int[5],
占用
20
个字节
.
所以它的大小是
20
data
是一个
struct,
每个变量分开占用空间
.
依次为
int4 + DATE20 + double8 =
32.
所以结果是
20 + 32
= 52.
当然
...
在某些
16
位编辑器下
, int
< br>可能是
2
字节
,
那么结果是
int2 + DATE10 +
double8 = 20
4
、队列和栈有什么区别?
答案:队列先进先出,栈后进先出÷
6
、已知一个单向链表的头,请写出删除其某一个结点的算法,
要求,先找到此
结点,然后删除。
答案:
slnodetype
*Delete(slnodetype
*Head,int
key){}
中
if(Head->n
umber==key)
{
Head=Pointer->next;
free(Pointer);
break;
}
Back
=
Pointer;
Pointer=Pointer->next;
if(Pointer->number==key)
{
Back->next=Pointer->next;
free(Pointer); break; } void delete(Node*
p) {
if(Head = Node)
while(p) }
7
、
请找出
下面代码中的所以错误说明:
以下代码是把一个字符串倒序,
如
“
abcd
”
倒序后变为“
dcba
”
1
、#
in
clude
2
、
main()
3
、
{
4
、
cha
r*src=
5
、
char*
dest=NULL;
6
、
int
len=strlen(src); 7
、
dest=(char*)malloc(len);
8
、
char* d=dest;
9
、
char* s=src[len];
10
、
while(len--!=0)
11
、
d++=s--;
12
、
printf(
、
return
0;
14
、
}
答案:还要加上#
include
int
main(){
char*
src
=
//<
/p>
要为
0
分配一个空间
char* d = dest; char* s =
&src[len-1]; //
指向最后一个字符
while( len-- != 0 ) *d++=*s--; *d = 0;
//
尾部要加
0
printf(
使用完,应当释放空间,以免造成内存汇泄露
return 0; }
华为笔
试题(
3
)
2006-09-29 19:41
一、判断题(对的写
T
,错的写
F<
/p>
并说明原因,每小题
4
分,共
20
分)
1
、有数组定义
int a[2][2
]={{1},{2,3}};
则
a[0][1]
的值为
0
。
(
正确
)
2
、
int
(*ptr) (),
则
ptr
是一维
数组的名字。
(错误
int (*ptr)
();
定义一个指向函
数的指针变量
)
3
、指针在任何情况下都可进行
>,
<,>=, <=,==
运算。
(
错误
)
4
、
switch(c)
语句中
c
可以是
int
,long,char ,
float
,unsigned
int
类型。
(
错,
不能用实形
)
二、填
空题(共
30
分)
1
、
在
p>
windows
下,
写出运行结果,
每空
2
分,
共
10
分。
char
str[ ]=
"
Hello
"
p>
;
char
*p=str;
int
n=10;
sizeof(str)=(
)
sizeof(p)=(
)
sizeof(n)=(
)
void func(char str[100]){
}
sizeof(str)=(
)
答案
:
6
,
4
,<
/p>
4
,
4,
具体
解释请参看我的空间里的“
C/C++
程序员应聘试题
剖析”
2
、
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
函数有什么结果?(
)
10
分
答案:输出
hello
,但是发生内存泄漏。
3
、设
int
arr[]={6,7,8,9,10};
int *ptr=arr;
*(ptr++)+=123;
-
-
-
-
-
-
-
-
-
上一篇:浅谈中学英语教学跨文化意识培养
下一篇:往年湖北特岗教师招聘考试综合知识真题