习题练习_

1. 有一个变量 unsigned char data;

请写出将 data 第6位置1的表达式:

data=data | (1<<6)

请写出将 data 第6位清0的表达式:

data=data & (0<<6)

请写出将 data 第6位取反的表达式:

data=data ^ (1<<6)

说明:最右边位为第0位,用十六进制表示。

2. (1)执行语句"k=11>>1;”后,变量k的当前值是

(2)有如下程序段:

int i,a,b,c,d;

char*errinfol="error";

char errinfo2[10];

char errinfo3[5];

memcpy(errinfo2,"error",strlen("error");

for(i-0;i<5;i++)

errinfo3[i]=errinfo2[i];

a=sizeof(errinfo1);

b=sizeof(errinfo2);

c=strlen(errinfol);

d=strlen(errinfo3);

请写出程序执行后a,b,c的值分别为多少:

d的值为多少井写出原因:

(1)、k=22

(2)、a=8,b=20,c=1,d=6

3、typedef struct

{

short with;

typedef struct

short lenth;

{

}base;

base* baseInfo;

short height;

typedef struct

}BoxInfo;

{

base baselnfo;

short height;

}WinInfo;

系统中有如下三个全局变量,且已经为这些变量分配内存,类型声明为:

extern WinInfo tmpInfol;

extern BoxInfo tmpInfo2;

extern BoxInfo* tmpInof3;

请根据要求写出赋值语句:

(1)为tmpInfo1的域 height赋值为1:

(2)为tmpInfo1的域 with 赋值为2:

(3)为tmpInfo2的域height赋值为1:

(4)为tmpInfo2的域with赋值为2:

(5)为tmpInfo3的域height赋值为1:

(6)为tmpInfo3的域 with赋值为2:

tmpInfo1.height == 1

tmpInfo1.baseInfo.with == 2

tmpInfo2.height == 1

tmpInfo2.baseInfo->with == 2

tmpInfo3.height == 1

tmpInfo3.baseInfo->with == 2

4.有如下程序段:

int fun(int*p){

return p[6];

void UserInit(void){

nt a[10]={1,2,3,4,5,6,7,8,9,10}

int b;

b=fun(&a[2])

执行函数 UserInit后b中的值是

9

5.(1)A、B两个程序通过首地址为0x80000000的共享内存传递int型数据,A往该地址写值,B从该地址读值。该共享内存空间足够大。

请写出A程序将int tmp 变量写入地址为0x80000000内存的语句:

请写出B从地址为0x80000000内存读取数据并赋值给 int tmp的语句:

(2)有如下语句:

char * buf=(char *)malloc(1*)malloc(100);

该缓存用于封装通信数据包,请写出在buf[4]开始的四个字节内写入int 型变量 tmp的语句:

有如下程序段:
队列示例:
循环队列中保存
unsigned int countunt=getNum();
//调用函数获得所需缓存个数
char*buf[count];
//buf数组用来保存缓存地址
int i;
for(i=0;i buf[i]=(char*)malloc(100);
//分配100字节缓存
由于在定义数组时长度不能用变量,因此上述代码无法编译通过。在不改变程序段功能的情况下,请修改上述代码,改正其错误:

int *tmp = 0x80000000
int tmp = *0x80000000
memset(4,tmp,sizeof(int))
#define COUNT 100


6.假设循环队列用数组实现,其定义如下:
#define SEQLEN 32
:[N37O3S ] ubes iu!
/*用于存放队列数据的数组*/
int head;/*数组下标索引,指向队列头部,若队列不空,指向队列头元素*/
int tail ;/*数组下标索引,指向队列尾部,若队列不空,指向队列空元素*/

队列示例:

循环队列中保存了1、2、3三个数据的状态。

seqn

1

2

3

head=1

tail=4

(1)假如队列未满,现有变量data需要入队,请写出表达式;

(2)假如队列未空,现在需要从队列取一个元素并赋值给变量data,请写出表达式;

(3)请写出队列为空的判断条件:

(4)请写出队列满的判断条件:

(5)请写出清空队列的表达式:

(6)请写出计算队列中元素个数的表达式:

(7)队列最多可以存放几个元素:

seqn[tail] = data,tail = (tail+1+32)%32
data = seqn[head];head = (head-1+32)%32
head = = tail
head == (tail+1+32)%32
memset(seqn,0,sizeof(seqn))
(tail-head+32)%32
 

7.在某操作系统中,用数组 unsigned char Rdy[8]的64个位码来表示64个任务的状态,该数组称为就绪表。就绪表中的每一位表示某一个任务的状态,任务就绪则对应位置为1,任务非就绪则对应位清0。若任务0就绪,则Rdy[O]中的位0置为1,若任务1就绪,则Rdy[0]中的位1置为1,依次类推,若任务63就绪,则Rdy[7]中的位7置为1。

(1)若任务i就绪,请写出设置就绪表Rdy[]的表达式:

(2)若任务j从就绪态转为非就绪态,请写出设置就绪表Rdy[的表达式:

(3)在某一调度时刻就绪表中有多个任务为就绪态,假设任务0的优先级最高,任务63的优先级最低,请设计一个算法,找出最高优先级任务。

Rdy[i/8]中的位i%8置1

Rdy[j/8]中的位i%8置0

8.有如下程序段:

static int data[100];

void fun(int i,int*value){

data[i]=* value;

*value=0;

请分析上述代码存在何种隐患,应如何修改?

答:

void fun(int i, int* value)。

9.有如下程序:

#include

void fun(int *);

//库函数声明

main(){

char m=15;char m=15;

fun(&m);

//调用库函数fun

printf(“%d\n”,m);

请分析上述代码存在的问题,可能会引发何种后果:

fun的声明缺少返回类型和参数列表

10.有如下程序段:

void GetMemory(char *p)

//line 1

{

p=(char*)malloc(10);

//line 2

{

void Test(void)

{

char *str = NULL;

//line 3

GetMemory(str);

//line 4

strcpy(str, "hello world");

//line 5

printf(str);

//line 6

free(str);

//line 7

(1)请分析上述代码存在的bug?

答:

(2)请修正代码(写上行号与修改后的代码):

答:

void GetMemory(char **p) {
    *p = (char *)malloc(10);
}

你可能感兴趣的:(面试,职场和发展)