数据结构第6天

1、有一个变量unsigned char data;

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

data = data | 1 << 5

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

data = data &  ~(1 << 5)

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

data = data ^ 1 << 5

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

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

11的二进制是1011 右移一位 -> 101 =5

右移一位除以2

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

        d的值为多少并写出原因

a:8         指针为8位

b:10       数组的整个空间大小

c:5         不包括 \0

d:随机值,errInfo3中没有 '/0',计算长度时没有暂停条件

3、系统中有如下三个全局变量,且已经为这些变量分配内存,类型声明为:
extern WinInfo tmpInfo1;
extern BoxInfo tmplnfo2
extern BoxInfo*tmplnof3:

请根据要求写出赋值语句
(1)为tmpInfo1的域height 赋值为1:

tmpInfo1.height = 1

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

tmpInfo1.baseInfo.with = 2

(3)为tmpnfo2的域height赋值为1

tmpInfo2.height = 1

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

tmpInfo2.baseInfo -> with = 2

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

tmpInfo3 -> height = 1

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

tmpInfo3 -> baseInfo -> with = 2

4、有如下程序段:

执行函数 UserInit 后b中的值是

将 3 的地址传进fun里

将 3 作为首地址往后访问6个,访问到9

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

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

*(0x80000000) = temp

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

temp=*(0x80000000)

(2)有如下语句:
char *buf = (char*)malloc(100);

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

*(buf+4) = temp

(3)有如下程序段:

由于在定义数组时长度不能用变量,因此上述代码无法编译通过。在不改变程序段功能的情况下,请修改上述代码,改正其错误:

char *buf[100]        暂定一个比较大的数

6、假设循环队列用数组实现,其定义如下

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

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

seqn[tail]=data; tail=(tail+1+32)%32;

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

data=seqn[head]; head=(head-1+32)%32

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

head==tail

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

head==(tail+1+32)%32

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

memset(seqn,0,sizeof(seqn));

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

(tail - head +32)%32

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

22,有一个元素是留出来判断是否为满的

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

若任务0就绪,则Rdy[0]中的位0置为1,

若任务1就绪,则Rdy[0]中的位1置为1,

依次类推若任务63就绪,则Rdy[7]中的位7置为1

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

任务0-8:Rdy[0]

任务9-16:Rdy[1]

任务17-24:Rdy[2]

Rdy[ i / 8 ] = Rdy[ i / 8 ]  | 1 << ( i % 8 )

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

Ray[ j / 8 ] = Ray[ j / 8 ] & ~(1 << ( i % 8 ))

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

int fun(unsigned char* rdy)
{
    for(int i=0;i<8;i++){    //控制元素
        for(int j=0;j<8;j++){    //控制位数
            if(rey[i] & 1<<j){    //第i个元素的第j位为1时 return
                return i*8+j;
            }
        }
    }
    return -1;
}

8、有如下程序段:

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

只改变了value的值,没有改变外部数据

改为:用 int** value接 ,data[i]=**value


9、有如下程序:

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

char 只能定义字符型变量,程序报错

10、有如下程序:

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

只对p进行了指针指向赋值,没有对str做改变

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

//line4        GetMemory(&str)        传址

//line1        void GetMemory(char **p)        用二级指针去接

//line2        *p=(char*)malloc(10);        *p访问str的空间 *p=str

  • 20
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值