代码之家  ›  专栏  ›  技术社区  ›  St.Antario

为队列设计调整大小函数

  •  1
  • St.Antario  · 技术社区  · 7 年前

    typedef struct queue queue;
    
    /**
     * Resizes a given queue.
     *
     * Changes the size of the queue passed as a parameter. 
     * The content of the resized queue prior to the lesser
     * of new and old sizes is left unchanged. 
     *
     * Returns:
     *  0 - on success
     * -1 - on error and the content of the original queue is left unchanged
     */
    int queue_resize(queue * queue_ptr, size_t new_size);
    

    问题是我把合同读给 realloc 结果如下:

    这个 重新分配

    int queue_resize(queue *queue_ptr, size_t); 使 queue * queue_resize(queue *queue_ptr, size_t);

    1 回复  |  直到 7 年前
        1
  •  3
  •   bitmask    7 年前

    realloc 必须能够将分配的空间移动到不同的地址,才能正常工作。想象一下,在当前分配的内存已经被使用之后,内存就被占用了。如果不重新定位,就无法创建连续序列。

    通常,您的队列如下所示

    typedef struct queue {
      some_type* data_member;
      size_t size;
      size_t capacity;
      // .. perhaps more
    } queue;
    

    所以当你有一个 queue_resize 你只需要传递一个 queue* 重新分配 不是 但它 data_member . 因为你已经有一个指向 queue 对象,只需更新 数据\u成员 如果 重新分配

    在这种情况下,返回一个新的 对象不是必需的,因为 队列 永不改变。你也不必通过考试 queue**

        2
  •  2
  •   Marichyasana    7 年前

    • 一个新的数组被分配了所需的大小;这包括设置元数据
    • 必须设置一个锁,以便旧数组不会更改
    • 所有数据都从现有数组复制到新数组;包括更新元数据;请注意,这两个数组需要同时存在
    • 原始数组将被删除(此处不确定是否正确)
    • 锁已拆下
    • 您可以使用标准方法(如Add()和Remove()轻松地复制数据