一、填空选择题
1、请写出输出结果 ~A = 4294967285
c=-128
unsigned short A = 10;
printf("~A = %u\n", ~A);
char c=128;
printf("c=%d\n",c);
2、写出输出结果____>6_______
void foo(void)
{
unsigned int a = 6;
int b = -20;
(a+b > 6) ? puts("> 6") :puts("<= 6");
}
解析:当一个运算中一个运算数为有符号,一个运算数为无符号数,C语言会隐式地将有符号数强制类型转换为无符号数,然后执行两个无符号数之间的运算。
3、 已知一个数组table,用一个宏定义,求出数据的元素个数__________________________ ___#define_Elem_Num()_sizeof(table)/sizeof(table[0])___________________________
4、进程在系统中是否存在的唯一标识是(D)
A、数据集合 B、目标程序
C、源程序 D、进程控制块
5、32位机器上定义以下结构体:
struct x
{
long long _x1;
char _x2;
int _x3;
char _x4[2];
static int _x5;
};
请问sizeof(x)的大小是多少______24__________
解析:
32位机器:
longlong _x1; 8字节 8
char_x2; 1字节 1+3(考虑内存对齐,下一个占4字节,此处应加3,保证下一个从4的倍数内存开始)
int_x3; 4字节 4
char_x4[2]; 2*1字节 2 + 2 (保证内存总数是8的倍数,加6)
staticint _x5; 在静态区,不在栈中,不考虑
总共8+8+4+4=24
二、简答题
1、给定一个整型变量a,写两段代码,第一个设置a的bit 3,第二个清除a 的bit 3。在以上两个操作中,要保持其它位不变。
答:
(1)int set_bit3(int a
{
int mask = 0xfff4;
a = a || mask;
return a;
}
(2)int clear_bit3(int a)
{
int mask = 0xfffb
a = a && mask;
return a;
}
2、什么是进程死锁?造成进程死锁的原因?
(1)进程死锁
两个或两个以上进程在执行过程中,由于竞争资源或通信造成的一种阻塞现象,若无外力作用,它们都将无法推进下去。
(2)原因
a.系统资源不足
b.进程运行推进的顺序不合适
c.资源分配不当
(解析:如果系统资源充足,进程资源请求能够得到满足,死锁的可能性就会降低,否则就会因争夺有限的资源而陷入死锁。其次,进程运行推进顺序速度不同,也可能产生死锁)
(3)解决方法
a.互斥条件:一个资源每次只能被一个进程使用;
b.请求与保持条件:一个进程因请求资源而阻塞是,对已获得的资源保持不放;
c.不剥夺条件:进程已获得的资源,在未使用完之前,不能强行剥夺;
d.循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
(解析:这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,只要上述条件之一不成立,就不会发生死锁。)
三、程序题
1、用递归算法判断数组是否为一个递增数组
void Is_Increase(int *arr, int len)
{
static int i = 0;
if((*(arr + 1) > *arr) && (i < len)) //数组后一个元素大于前一个成立
{
i++;
Is_Increase(++arr, len);
return;
}
if((len - 1) == i)
{
printf("Is increase array\n");
}
else
{
printf("Not increase array\n");
}
}