2015-02-12 212 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