2015-02-12 126 views
0

当涉及到结构时,关于指针有很多问题,但我在这里做的是更复杂一点,让我难以置信。指针内指针的指针

我有一个用于xv6的proc结构。我试图实现mmap,其中'eager_mmap'采用fd和0,'lazy_mmap'采用1。

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

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

的结构在这里被定义为:每mmaped区域,我需要知道哪些地址是开始于IS和能够访问该区域的大小。

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

'proc'是指向'proc'类型结构的指针? – Vagish 2015-02-12 04:59:27

+1

结构声明后应该有';'。这是你的编译器告诉你的唯一错误吗? – justanothercoder 2015-02-12 04:59:51

+0

哦!不,不,那些实际上在代码中。我只是没有把它们放在这里,我编辑。 – 2015-02-12 05:01:27

回答

2

下面的代码完全编译(一个对象文件):

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()成为可能在文件中可见。我想知道你的麻烦不是你的编译中缺少头文件。

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

+0

包含file.h后,它工作。非常感谢。我很感激。 – 2015-02-12 05:45:18