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

C 指针中的指针指针中的指针,c,arrays,pointers,struct,C,Arrays,Pointers,Struct,这里有很多关于指针的问题,但是我在这里做的事情有点复杂,让我很困惑 我有一个xv6的proc结构。我正在尝试实现一个mmap,其中fd和0表示“渴望的mmap”,1表示“懒惰的mmap” 在这个proc-struct中,我声明了一个结构数组,它将包含该进程中的所有mmaped文件 struct proc { struct proc_mmap mapped_files[NOFILE]; .... }; 这里定义了结构:对于每个mmaped区域,我需要知道它的起始地址,并且能够访问

这里有很多关于指针的问题,但是我在这里做的事情有点复杂,让我很困惑

我有一个xv6的proc结构。我正在尝试实现一个mmap,其中fd和0表示“渴望的mmap”,1表示“懒惰的mmap”

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

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; 
};

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

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

我非常感谢您的帮助,但更重要的是,请您解释一下我做错了什么。谢谢

编辑:


以下代码可以干净地编译(到对象文件):

我修正了各种输入错误(
int
struct
,缺少分号),并将
process
设置为一个外部变量,这样我就不会收到关于未初始化成员的投诉

在问题代码中,您说:

// next two structs are in another header file
这两个结构定义必须在包含示例
main()
的文件中可见,才能进行访问。我想知道你的问题是否在于你的编译中缺少标题


您只需提及结构类型即可定义(指向结构类型的指针),而无需定义其内容。但在定义结构体之前,不能取消对指针的引用或访问结构成员。这对于不透明类型很有用。

是'proc'是指向'proc'类型结构的指针吗?应该有
在结构声明之后。这是编译器告诉您的唯一错误吗?发布一个简短的、完整的程序来演示您的问题,因为有太多错误的定义顺序,以及您如何声明
proc
您可能做错了,这在这里并不明显。如果你做得对,效果很好:我建议检查所有的名字是否都在正确的位置可见,并且它们不会与库中的内容冲突<代码>索引节点
可能存在冲突。还有可能重新编译。@noc_编码员:如果没有出现您所描述的问题,那么编写“较小版本的程序”是没有意义的。
4
只是
sizeof(int)
。在包含file.h之后,它工作了。谢谢。我很感激。
uint sz = proc->mapped_files[s].fsize->ip->size; 
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;
}
// next two structs are in another header file