指针中的指针指针中的指针

Pointers within pointers within pointers

这里有很多关于结构的指针问题,但我在这里做的有点复杂,让我很困惑。

我有一个 xv6 的过程结构。我正在尝试实现 mmap,它采用 fd 和 0 表示 'eager_mmap' 或 1 表示 'lazy_mmap'。

在这个 proc 结构中,我声明了一个结构数组,它将包含该进程中的所有映射文件。

struct proc {
    struct proc_mmap mapped_files[NOFILE];
    ....
};

结构在这里定义:对于每个 mmaped 区域,我需要知道它的起始地址是什么,并且能够访问该区域的大小。

struct proc_mmap
{
    int address;
    struct file *fsize;
};

好的,现在开始复杂的部分。我可以通过 file.h 访问该区域。具体来说,如果我通过文件结构,然后是 inode 结构,都在下面列出,那么我可以获得位于 struct inode 中的 mmaped 区域的大小。

struct file {
    ...
    struct inode *ip; 
};

struct inode {
    ...
    uint size; 
};

好的,现在当我尝试访问这个变量来做急切的映射时(其中 s 是数组中的索引),

uint sz = proc->mapped_files[s].fsize->ip->size; 

编译器告诉我对成员 'ip' 的请求不是指针或联合中的东西。但我认为左边的是一个指针......我不确定我做错了什么,尽管我已经尝试了很多方法来解决这个问题(最后一行代码是最新的)。

我真的很感激帮助,但更重要的是对我做错了什么的解释。谢谢!

编辑:

struct proc_mmap {
    int addr;
    struct file *fsize; };


struct proc {
    int proc_mmap mapped_files[30]; // was NOFILE
};
 // next two structs are in another header file
struct file {
    struct inode *ip;
}
struct inode {
    int size; 
}

int main ()
{
    struct proc process; 
    // assume on first page table 
    int s = process-> mapped_files[0].fsize->ip->size; 
    return 0;
}

以下代码编译干净(到目标文件):

struct proc_mmap
{
    int addr;
    struct file *fsize;
};

struct proc
{
    struct proc_mmap mapped_files[30];
};

struct file
{
    struct inode *ip;
};

struct inode
{
    int size;
};

extern struct proc process;

int main(void)
{
    int s = process.mapped_files[0].fsize->ip->size;
    return s;
}

我修正了各种拼写错误(intstruct,缺少分号),并将 process 变成了一个外部变量,这样我就不会收到关于未初始化成员的投诉。

在问题代码中,你说:

// next two structs are in another header file

这两个结构定义必须在包含样本 main() 的文件中可见,才能进行访问。不知道你的问题是不是你编译的头文件少了

您可以简单地通过提及来定义(指向某个)结构类型,而无需定义其内容。但是在定义结构体之前,您不能取消引用指针或访问结构成员。这对不透明类型很有用。