【问题标题】:structure with linked-list memory dump带有链表内存转储的结构
【发布时间】:2010-08-14 12:13:04
【问题描述】:

有没有我在学校错过的标准方法以合理的方式将 C 带有嵌套链表的结构转储到磁盘上? 我不想做的是:

  • 使用协议缓冲区或任何其他类似的序列化器,
  • 不想创建 JSON、XML 或其他

我有几个想法:

  • 分配准确的内存量(或扩展现有的内存量)并自行管理,将列表元素放置在类似堆栈的方法中,使用一些额外的字段来管理相对地址。必要时在磁盘上转储块。具有从磁盘映射块的过程可以创建可识别字节顺序的理想结构。
  • 将主要结构推入文件,然后推入列表元素,将列表信息存储在文件头中。

为了形象,我将提供更多细节发布示例代码:

typedef struct{
   int b;
   List *next;
}List;

typedef struct{
   float b;
   List2 *next;
}List2;

typedef struct{
   List *head;
   List *tail;
} info;

typedef struct{
   List2 *head;
   List2 *tail;
} info2;

struct data
{
    int a;
    char t[10];
    info first;
    info second;
    info2 third;
};

干杯 P.

编辑:

我已经扩展了主要结构,似乎之前的一个没有完全说明问题。 我知道磁盘上的指针是无用的。 允许想法和伪代码。

【问题讨论】:

    标签: c memory-management linked-list nested-lists diskimage


    【解决方案1】:

    我没有正确理解您的问题,但是将结构转储到磁盘并可靠地读回有多个问题。

    最重要的是结构填充或字节填充。所以你也必须照顾好它。

    【讨论】:

      【解决方案2】:

      没有很好的方法可以做到这一点,因为这些将具有内存地址,并且下次读入时,它将包含可能无效的内存地址...您唯一可以做的就是持有数据被读写的区域,我们来看看如何根据链表的内容将数据写入磁盘...

      结构 rwBufferData{ 诠释一个; 字符 t[10]; };

      并在写入之前使用memsetmemmove 填充“rwBufferData”

      结构 rwBufferData rwBuf; 结构数据 *dataPtr; memset(&rwBuf, '\0', sizeof(struct rwBufferData)); memmove(&rwBuf, dataPtr, sizeof(struct rwBufferData));

      现在您可以将rwBuf 写入文件...我将把反向操作留作练习...

      【讨论】:

      • 我认为您在我的帖子中没有意识到结构类型,它们代表不同的方案。假设您的帖子我感觉您尝试或多或少地提出我在第二点提出的相同解决方案。还是我错过了一些重要的部分?我知道磁盘上的指针是没用的。
      • 永远不应该存储列表信息,因为内存地址是无用的,这就是我的解决方案的用武之地,通过将​​列表节点的一部分复制到缓冲区中,以准备写入磁盘...您从代表列表开头的文件的“顶部”(逻辑)开始,并通读它,并构建列表......
      【解决方案3】:

      按照数据在链表中的顺序将数据序列化,记录样式到文件中。 fwrite 对此特别有用。一定要取消引用指针,并注意字节序在其中扮演的角色。

      这是一些模糊的伪代码:

      List *list_new();
      List *list_add(List *, void *data);
      List *list_next(List *);
      
      while (node) {
          fwrite(node->data, sizeof(node->data), 1, fp);
          node = list_next(node);
      }
      

      读回实时列表的粗略代码:

      List *node = list_new();
      while (true) {
          struct data *buf = malloc(sizeof(*buf));
          if (1 != fread(buf, sizeof(*buf), 1, fp))
              break;
          list_add(node, buf);
      }
      

      更新0

      如果您开始嵌套更高级的结构,例如其他链表、可变长度字符串等,您需要为每条记录提供类型和长度,以及在其他记录中嵌套记录的方法。

      例如,如果您的顶级链接列表的数据成员是另一个列表,您最好将该成员存储为嵌套记录,并带有长度和类型字段。或者,您可以定义标记记录,例如为字符串定义\0(一个明显的选择),为结构数据定义归零块。

      【讨论】:

      • 如何通过反序列化包含更多链表的更复杂结构来解决更复杂的问题?
      • 好的,我认为这可行:您的解决方案 + 假设:每个列表链都将按顺序存储,保存最后一个元素标记为它是 NULL 元素的一些信息。然后阅读流我会知道哪些列表在哪里结束。
      猜你喜欢
      • 2017-08-10
      • 1970-01-01
      • 2023-03-23
      • 2015-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多