将用户定义的类型强制转换为 char* 时会发生什么?

What is happening when a user-defined type is cast to a char*?

我遇到了一堂课,我们使用了一个名为 "Person" 的用户定义类型,该类型将人的姓名存储在字符数组中,并将年龄存储为整数。该课程是关于编写和读取二进制文件的。主程序如下所示:

int main()
{
Person anil("anil",24); //initialize with name and age

fstream file("person.bin", ios::binary | ios::in | ios::out | ios::trunc);

if (!file.is_open())
    cout << "Error while opening file.";
else
{
    file.write((char*)&anil, sizeof(Person));
    file.seekg(0); // go back to beginning

    Person anjali;  //declare new person object

    //first argument is memory block, second argument is byte size
    file.read((char*)&anjali, sizeof(Person));

    anil.whoAreYou();  //outputs the name and age
    anjali.whoAreYou();
}

return 0;
}

我不明白这些行是怎么回事:

file.write((char*)&anil, sizeof(Person));
file.read((char*)&anjali, sizeof(Person));

我理解 fstream 的写入和读取函数需要 memory_block 作为第一个参数...有人可以解释当对用户定义类型的引用被转换为 char * 时到底发生了什么吗? ?

在C/C++中,char *经常被用作通用数据类型,因为它总是指向1个字节。您代码中的转换代码 (char*)&anil 使用 & 获取指向 anil 的指针,并将其转换为指向 char 的指针。它将 char 的序列写入文件,然后将其读回 anjali.

的内存中

这会进行精确的内存复制,如果您有指向该内存中其他地方的指针,这会导致问题,因为在加载对象时该指针几乎永远不会有效。这可能只是一个例子,但现实世界的序列化非常棘手,通常最好留给某种序列化库。手动序列化是可能的,但只能在图书馆或类似的地方非常小心地完成。

如果您希望进行这种手工序列化,您需要确定序列化的格式并将基值写入文件。您还需要确定您是否真的需要二进制序列化,或者基于文本的序列化是否更适合。在大多数情况下,将对象写入 JSON 这样的文件格式会更容易一些,并且还具有在语言之间可移植和人类可读的优点。

std::fstream 派生自 std::istream,它基本上是 basic_istream<T>char as T.

的类型定义

因此,fstream::read 需要一个字符指针作为第一个参数,并且转换将 anil 的起始地址转换为 char*。因为 sizeof(char) == 1 在大多数情况下系统这是必不可少的,将 Person 实例的内容逐字节复制到提供的地址。

这在长 运行 中既不可移植也不可维护,特别是如果您在 类 中将指针作为成员变量,因为您实际上将序列化变量的原始内存地址。