我在项目中遇到了以下代码段,并且不确定如何计算变量“响应”的值。在这里我们可以看到,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]]));
}
答案 0 :(得分:1)
该行没有访问2D数组,它正在访问一维指针数组,然后解除引用它的指针。
让我们把它分解成几步。从:
开始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
也会隐藏同名的全局变量。小心那里!