如何编写其中包含指针的结构

How to write struct that has pointer in it

我有一个结构,它有一个指向另一个结构的指针:

typedef struct _contacts
{
    Contact *elements;
    int length;
    int capacity;
} Contacts;

这是我的联系人结构:

typedef struct _contact
{
    int id;
    char firstName[NAME_SIZE];
    char lastName[NAME_SIZE];
    char address[ADDRESS_SIZE];
    char email[EMAIL_SIZE];
    char phoneNumber[NUMBER_SIZE];
    char homeNumber[NUMBER_SIZE];
} Contact;

当我尝试使用 fwrite 在二进制文件上写入联系人时,

Contacts *contacts = newEmptyContacts();
// do something with contacts...
fwrite(contacts, sizeof(Contacts), 1, file);

它写了一个指向联系人的指针,这是我不想要的。

如何沿边长和容量成员存储联系人的每个元素?

您的代码写入指向文件的指针是正常的,这就是您要求代码执行的操作。您需要编写 contacts 元素 而不是编写 contacts 结构。您还需要以某种方式写入联系人数量,以便读取文件的代码知道要读取多少联系人:

假设length是实际联系人数量,capacity是可用存储空间space,你的代码大致应该是这样的:

Contacts *contacts = newEmptyContacts();
// do something with contacts...

// write the number of contacts and capacity to the file    
fwrite(&contacts.length, sizeof(contacts.length), 1, file);
fwrite(&contacts.capacity, sizeof(contacts.capacity), 1, file);

// write all contacts to the file
fwrite(contacts.elements, sizeof(Contact), contacts.length, file);

读取的代码可能是这样的:

int length;
int capacity;

// read the length from the file    
fread(&length, sizeof(length), 1, file);

// read the capacity from the file    
fread(&capacity, sizeof(capacity), 1, file);

// allocate a Contacts structure for length contacts
Contacts *contacts = newContacts(capacity);  

// read length contacts from the file
fread(contacts.elements, sizeof(Contact), length, file);
contacts.length = length;
...

Contacts *newContacts(int capacity)
{
  Contacts *contacts = malloc(capacity* sizeof(*contacts));
  contacts->capacity = capacity;
  contacts->length = 0;
  return contacts;
}

免责声明:这是未经测试的代码,它可能包含错误并且根本没有错误检查,但你应该明白。