指针中的指针指针中的指针
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;
}
我修正了各种拼写错误(int
到 struct
,缺少分号),并将 process
变成了一个外部变量,这样我就不会收到关于未初始化成员的投诉。
在问题代码中,你说:
// next two structs are in another header file
这两个结构定义必须在包含样本 main()
的文件中可见,才能进行访问。不知道你的问题是不是你编译的头文件少了
您可以简单地通过提及来定义(指向某个)结构类型,而无需定义其内容。但是在定义结构体之前,您不能取消引用指针或访问结构成员。这对不透明类型很有用。
这里有很多关于结构的指针问题,但我在这里做的有点复杂,让我很困惑。
我有一个 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;
}
我修正了各种拼写错误(int
到 struct
,缺少分号),并将 process
变成了一个外部变量,这样我就不会收到关于未初始化成员的投诉。
在问题代码中,你说:
// next two structs are in another header file
这两个结构定义必须在包含样本 main()
的文件中可见,才能进行访问。不知道你的问题是不是你编译的头文件少了
您可以简单地通过提及来定义(指向某个)结构类型,而无需定义其内容。但是在定义结构体之前,您不能取消引用指针或访问结构成员。这对不透明类型很有用。