我正在用C构建这个文件系统。目前我正处于分配的第一步,这就是创建一个在内存中工作的简单文件系统。我的问题更多地基于C而不是Unix文件系统。我试图“模仿”原始磁盘。我有以下结构:
struct disk {
void *data;
unsigned int numOfBlocks;
};
让我们假设这个磁盘上的一个块将是512字节(就像原来的Unix文件系统一样)。我定义了一些函数来创建磁盘,从磁盘读取和写入磁盘。然后我的工作是实现各种事情,如数据块,i节点块,超级块等。
查看上面的void *data
变量。我希望这是一个二维数组。它应该是一个块数组的数组。所以...最有意义的是使用这样的东西。
unsigned char *data[30][512]; // Assuming the disk holds 30 blocks of 512 bytes each
问题在于:如果我定义了其他结构来表示i节点,超级块或数据块,并且每个结构的struct
大小都是512字节,那我该如何正确地进行转换?这个unsigned char *
到i-node struct
,还是数据struct
等?
感谢。
答案 0 :(得分:1)
我不确定我理解这个问题。
根据你的说法:
My question isn't how to access the characters in the data variable...it's how to take a 512 byte array of unsigned char for instance and convert it to some other type of struct that is 512 bytes long.
如果你有:
unsigned char block[512];
和
//total struct size: 512 bytes
struct something {
//members here
};
你可以这样做:
int main(void)
{
struct something *ptr;
ptr = block;
return 0;
}
您可以使用数组字节来保存结构数据。为避免警告,请转发地址:
ptr = (struct something *)block;
为指针分配内存后,您可以像往常一样使用它。
注意:我可能是错的,因为我是初学者。
答案 1 :(得分:0)
void
指向任何事情,所以如果你能控制void *
的含义,那么你的定义就足够了。
要将data
作为二维数组进行访问,您只需要转换类型((char (*)[512])data
或
char *array[512] = data;
byte = array[x][y];
编译器不需要知道第二维的大小,您有责任确保您的程序永远不会访问无效的位置。