说明:
1:以下各题均使用如下假设:int, long, short, char类型数分别为4字节、4字节、2字节、1字节,double类型数为8字节,指针变量的size为4字节。
2:试题中许多变量命名直接用a,b,c等简化形式,本该用宏的地方也直接用了数字,是因为这里不用考虑变量和宏的具体含义。实际开发写代码时当然不允许这样做。
3:对齐方式假设是4字节对齐
4:题目中用到的类型如下:
BYTE - 无符号单字节
WORD - 无符号双字节
DWORD - 无符号四字节
一、 不定项选择题(20分):
1、数据库技术中的“脏数据',是指( )的数据。
A.错误 B.回返 C.未提交 D.未提交的随后又被撤消
2、假定x和y为double型,则表达式x=2,y=x+3/2的值是( )
A. 3.500000 B. 3 C. 2.000000 D. 3.000000
3、以下数组定义中不正确的是( )
A. int a[2][3]; B.int b[][3]={0,1,2,3};
C. int c[100][100]={0}; D.int d[3][]={{1,2},{1,2,3},{1,2,3,4}};
4、char str[4][10]={"first","second","third","fourth"},*strp[4];
int n;
for (n=0;n<4;n++) strp[n]=str[n];
若K为int型变量0=<k<4,则对字符串的不正确引用是 ( )
A. strp B.str[k] C.strp[k] D.*strp
5、描述“当x的取值在[1,10]和[20,30]范围内为真,否则为假”的表达式是( )
A. (x>=1)&&(x<=10)&&(x>=20)&&(x<=30)
B. (x>=1)|| (x<=10)||(x>=20)||(x<=30)
C. (x>=1)&&(x<=10)||(x>=20)&&(x<=30)
D. (x>=1)||(x<=10)&&(x>=20)||(x<=30)
6、若有运算符:>、*=、=、%、sizeof,则它们按优先级(由低至高)的正确排列次序为( )
A. *= = > % sizeof B. = *= % > sizeof
C. *= > = sizeof % D. *= > = % sizeof
7、对栈S进行下列操作:push(1).push(2).pop( ),pop( ).则此时栈顶元素是( )
A. 1 B. 2 C.0 D.不确定
8、下面程序的输出是()
main()
{
int a=-1, b=4,k;
k=(a++<=0) || (!(b--<=0));
printf("%d %d %d/n",k,a,b);
}
A) 0 0 3 B) 0 0 4 C) 1 0 4 D) 1 0 3
9、int gCount=0;
void fun(void)
{
gCount++;
}
假设gCount++这一句被编译成3条机器指令:
从内存中读gCount到CPU寄存器x;
寄存器x的内容加一;
把寄存器x的内容写至内存中的gCount。
如果有两个任务调用fun函数,且各调用一次,那么,gCount的值可能变为( )
A. 0 B. 1 C. 2 D. 3 E. 4 F. 都不对
10、下列描述正确的是( )
A. 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。
B. 线程是进程的一个实体,是CPU调度和分派的基本单位,它比进程更小的能独立运行的基本单位。
C. 在多线程中,在不同线程中计算同一个数据时,需要用锁,锁可以保护单线程代码
D. Linux的读写自旋锁为读和写分别提供了不同的锁,一个或多个读任务可以并发的持有读者锁;用于写的锁最多只能被一个写任务持有,而且此时不能有并发的读操作
二、填空题(30分):
1、有如下程序
typedef struct
{
int a:2;
int b:2;
int c:1;
}test;
test t;
t.a = 1;
t.b = 3;
t.c = 1;
printf("%d",t.a);
printf("%d",t.b);
printf("%d",t.c);
上述代码输出结果是________
2、有以下程序
main( )
{ char k; int i;
for(i=1;i<3;i++)
{ scanf(“%c”,&k);
switch(k)
{
case ‘0’: printf(“another/n”);
case ‘1’: printf(“number/n”);
}
}
}
程序运行时,从键盘输入:01<回车>,程序执行后的输出结果是________
3、有以下程序
unsigned char *p1;
unsigned long *p2;
p1=(unsigned char *)0x801000;
p2=(unsigned long *)0x810000;
p1+5=________;
p2+5=________ ;
4、已知一个数组table,用一个宏定义,求出数据的元素个数,宏名为:NUM, 怎么写________
5、要对绝对地址0x100000赋值1234,怎么写________
如果让程序跳转到绝对地址是0x100000去执行,怎么写________
6、有如下程序片段,写出输出
unsigned short A = 10;
printf("~A = %u/n", ~A);//(1)
char c=128;
printf("c=%d/n",c);//(2)
则 (1)的输出为__________
(2)的输出为__________
7、如下程序
#include <stdio.h>
typedef unsigned short WORD;
typedef unsigned char BYTE;
typedef unsigned long DWORD;
union ENTRY
{
struct
{
WORD wVal0;
WORD wVal1;
}ValueGet;
struct
{
BYTE wa1:4;
BYTE wa2:4;
WORD wb:12;
WORD resv:4;
}ValueSet;
};
int main(void)
{
ENTRY Entry;
Entry.ValueGet.wVal0 = 0xabcd;
Entry.ValueGet.wVal1 = 0x1234;
printf("Entry.ValueSet.wa1 is 0x%x/n",Entry.ValueSet.wa1); // (1)
printf("Entry.ValueSet.wa2 is 0x%x/n",Entry.ValueSet.wa2); // (2)
printf("Entry.ValueSet.wb is 0x%x/n",Entry.ValueSet.wb); // (3)
printf("Entry.ValueSet.resv is ox%x/n",Entry.ValueSet.resv); // (4)
}
则 (1)的输出为__________
(2)的输出为__________
(3)的输出为__________
(4)的输出为__________
8、有如下程序段:
struct mesage1
{
char type;
short flag;
int num;
double value;
};
struct message2
{
char type;
int num;
short flag;
double value;
};
假设在32位机器上,
sizeof(message1)=__________
sizeof(message2)=__________
三、判断题:正确的填T,错误的填F(10分)
1、语句“if(a>b) max=a;else max=b;”与“max=(a>b)?a:b;”的作用相同 ( )
2、(void *)ptr 和 (*(void**))ptr的结果是否相同?其中ptr为同一个指针。 ( )
3、在编码中,OSS_GetPIDByName函数要在初始化的时候使用,其他情况不使用,否则会影响性能( )
4、有关定时器的使用:一般应用中我们启动定时器等待某个消息的应答,如果定时器到期前收到该消息,那么需要杀死定时器;如果定时器超时,此时调用杀死定时器接口杀定时器也不会有什么影响。( )
5a、(非V4项目人员)在编码中,大于2K字节的数据或者结构,不在定义的时进行初始化,要在上电的时候进行初始化()
5b、(V4项目人员)在不同进程中映射同一块共享内存后,得到的逻辑地址相同 ( )
四、改错题(8分)
1、下列代码是否正常,如不正确,请指出错误原因
(1)void test1()
{
char string[10];
char* str1 = "0123456789";
strcpy( string, str1 );
}
(2)void test2()
{
char string[10], str1[10];
int i;
for(i=0; i<10; i++)
{
str1[i] = 'a';
}
strcpy( string, str1 );
}
2、下列代码是否正常,如不正确,请指出错误原因
swap( int* p1,int* p2 )
{
int *p;
*p = *p1;
*p1 = *p2;
*p2 = *p;
}
3、下面调用是否符合正确,如果不正确请说明原因并给出正确结果
函数原型:
OSS_STATUS OSS_Printf(WORD16 wModuleName, WORD32 dwErrId, BYTE ucPrnLevel, const void *pFormat, ...)
如下调用:
void fun()
{
…// 省略
OSS_Printf(PRINT_SIG_BICC, PRN_NORMAL, PRN_LEVEL_HIGH, "/nBICCCPCI [%06d]: Receive Unexpected Event(%d) in iWaitClr state.file: %s, Line: %d",psData->selfCsn.index, wEvent, __LINE__, __LINE__);
…// 省略
}
五、问答题(12分):
1、 怎么打印出当前源文件的文件名及行号?
2、名词解释:inline、extern、typedef、static
3、描述内存分配方式及他们的差别?
六、编程题(20分) :
1、顺序栈的定义如下,请编码完成入栈和出栈的的功能。
#define STACK_INIT_SIZE 10
#define STACKINCREMENT 2
typedef int Status;
typedef int SElemType;
typedef struct
{
SElemType *base;
SElemType *top;
int stacksize;
}SqStack;
Status Push(SqStack S,SElemType e);//入栈
Status Pop(SqStack S);//出栈
2、请按照规范编写一个内存搬移函数memmove,目的地址为pDest;源地址为pSrc;长度为ucLen。