C 指针中的指针指针中的指针
这里有很多关于指针的问题,但是我在这里做的事情有点复杂,让我很困惑 我有一个xv6的proc结构。我正在尝试实现一个mmap,其中fd和0表示“渴望的mmap”,1表示“懒惰的mmap” 在这个proc-struct中,我声明了一个结构数组,它将包含该进程中的所有mmaped文件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区域,我需要知道它的起始地址,并且能够访问
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