1

我在一个项目中遇到了下面的代码片段,不确定如何计算变量“响应”的值。在这里我们可以看到, pic_data 保存两个一维数组,但“响应”将这两个一维数组作为二维数组访问。谁能解释一下这是如何工作的?

注意:下面的代码不是更大代码块的完整代码片段。

#define MAX 100
#define MAXBUF 100

u32 response;
u32 index;

typedef struct {
    u16         flag;   
    u16         status;  
} __attribute__ ((packed)) register;

typedef struct
{
    register      *rq[MAX];
    u64            buf[MAXBUF];

}Data;

Data *pic_data;



void getres(Data *pic_data) {
    response = *((u32*)&(pic_data->rq[index][pic_data->buf[index]]));
}
4

1 回答 1

1

该行不是访问二维数组,而是访问一维指针数组,然后取消引用它得到的指针。

让我们把它分解成几个步骤。从...开始:

response = *((u32*)&(pic_data->rq[index][pic_data->buf[index]]));

我们可以重写为:

register *r = pic_data->rq[index]; // figure out which element of 'rq' to use
u64 offset = pic_data->buf[index]; // figure out what offset to use from 'buf'
response = *(u32 *)&r[offset];     // get the right register and extract value
                                   // into a 32-bit word

编者注: register是保留字,请勿用作类型名称。您的函数参数pic_data还会隐藏同名的全局变量。外面小心点!

于 2013-08-30T17:38:42.377 回答