在Struct" C"中动态增加数组大小。

时间:2017-05-09 10:48:24

标签: c arrays pointers struct

我的问题很简单......我声明了以下结构:

struct Address {
   int id;
   int set;
   char *name;
   char *email;
};

struct Database {
   struct Address rows[512];
};

struct Connection {
   FILE *file;
   struct Database *db;
};

现在说清楚,我初始化我的"数据库"在我的"连接"有一些虚拟地址。我稍后将这个数据库保存到我的" Connection"中的文件中。 struct with:

void Database_write(struct Connection *conn){
   rewind(conn->file);

   int rc = fwrite(conn->db, sizeof(struct Database), 1, conn->file);
      if(rc != 1){
         die("Failed to write database.\n",conn);
      }

   rc = fflush(conn->file);
      if(rc == -1){
         die("Cannot flush database.\n",conn);
      }

当我在"数据库"中有预定数量的行时,一切都很有用。我的地址的结构,即512.但是,如果我想动态地设置行数,该怎么办?可能作为传递给函数的参数?我尝试过使用以下内容......

struct Database {
   struct Address *rows;
};

使用以下命令为此指针分配空间:

conn->db->rows = (struct Address*) malloc(sizeof(struct Address)*max_rows);

max_rows是一个传递给函数的参数...但是,现在的问题是当我去尝试将其保存到我的" Connection" struct我只保存指针" struct Address * rows;"而不是分配给它的空间的数据。有关如何保存此已分配空间或在结构中具有预定数组然后动态增长的任何建议吗?

提前致谢!

1 个答案:

答案 0 :(得分:3)

您正在使用 malloc 进行创建动态数字的正确轨道 地址。

conn->db->rows = (struct Address*) malloc(sizeof(struct Address)*max_rows);

但是在 Database_write 中将它们写入文件时遇到问题。这是因为动态分配的结构不再具有硬连线的行数。您必须将 Database_write 更改为

  1. 传递要写入的行数。
  2. 调整 fwrite 行以写出所有行。
  3. 你有:

    void Database_write(struct Connection *conn)
    {
        rewind(conn->file);
    
        int rc = fwrite(conn->db, sizeof(struct Database), 1, conn->file);
        if(rc != 1){
            die("Failed to write database.\n",conn);
        }
    ...
    

    您现在需要以下内容:

    void Database_write(struct Connection *conn, int num_rows)
    {
        rewind(conn->file);
    
        int rc = fwrite(conn->db, sizeof(struct Database), num_rows, conn->file);
        if(rc != num_rows)
        {
            die("Failed to write database.\n",conn);
        }
    
    ...
    

    您还可以将数量添加到数据库结构中以记录方式 许多行应该在文件中:

    struct Database 
    {
        int num_rows;
        struct Address *rows;
    };
    

    在这种情况下,您应首先 fwrite 要先归档的行数 写下 struct Address 的num_rows。

    您可能还想查找 realloc 以更改行数 苍蝇提示 - 小心使用,并密切注意返回值。