【问题标题】:Dynamic Array Allocation confusion动态数组分配混乱
【发布时间】:2015-09-01 18:26:50
【问题描述】:

我要从用户那里读取几个值并将它们存储在一个数组中。然后我需要创建一个足够大的数组来存储所有这些值。使用我编写的一些函数,我通过数组对给定值进行排序/lsearch/bsearch。

我已经编写好了程序和所有内容,但对于静态数组实现。我对在哪里实际使用动态数组感到困惑。

当用户开始输入值时使用它是有意义的,因为我无法假设他输入了多少值,因此数组需要足够大以容纳它。当我创建一个足够大的数组来保存所有值(作为第一个数组的副本)时,使用它也是有意义的(有点)。

我不要求任何代码,一切都已完成,只是采用静态方法。我只是想在这里想象一下我需要在哪里使用 darrays。我的想法是:

  1. 当用户第一次输入值时
  2. 当我将 arr1 复制到一个新的 arr2 中时,该 arr2 需要足够大以容纳 arr1 的所有值。

我在这方面是对还是错?

【问题讨论】:

  • 展示你所拥有的。目前还不太清楚你想要完成什么。
  • 你需要 calloc 和 realloc
  • 由于您需要容纳在编译时无法可靠预测(限制)的大小的输入,因此您需要使用动态数据结构来存储初始输入。您需要在阅读输入时根据需要扩展它。如果您需要制作输入数据的副本,那么您需要第二个动态数据结构来保存它,但您可能永远不需要调整该数据结构的大小。动态分配的数组是一种可能适合的数据结构;还有其他的。

标签: c arrays dynamic dynamic-arrays


【解决方案1】:

首先使用malloccalloc 分配一个已知起始大小的数组,并跟踪变量中的当前容量。

当您读取值时,如果您的数组不够大,则用户 realloc 将数组的大小加倍。

【讨论】:

    【解决方案2】:

    最好的解决方案是不要在每次用户输入值时复制整个数组。对 malloc 和 free 的需求会很重,并且随着更大的数组变得更糟。

    您需要以“元素数量作为输入”来计算数组的大小

    int* 数组 = newArray(10);

    int* newArray(int size) { 返回 malloc(大小 * sizeof(int)); }

    请记住,int* 是一个数组,因此您仍然可以使用 array[3]。但是,如果集中存储已使用元素的数量和当前大小,则可以分配少量元素,并且仅在可用元素耗尽时才增长。

    struct DynamicIntArray {
      int used;
      int size;
      int* storage
    };
    
    void add(struct DynamicArray* array, int value) {
      if (used < size) {
        (*array).storage[used] = value;
        used++;
      } else {
        int newSize = size+10;
        int* newStorage = (int*)malloc(newSize*sizeof(int));
        int* oldStorage = (*array).storage;
        for (int i = 0; i < size; i++) {
           newStorage[i] = oldStorage[i];
        }
        (*array).storage = newStorage;
        (*array).size = newSize;
        free(oldStorage);
      }
    }
    

    举个例子。您应该可以编写newDynamicIntArray(...) 函数和freeDynamicIntArray(struct DynamicIntArray* array) 函数以及您关心的任何其他方法。

    【讨论】:

      【解决方案3】:

      我认为你问错了问题。

      问题是:
      动态数组(连续的内存块)是否适合在您的应用程序中保存和处理数据?

      数组只有一个特别有用的应用程序,那就是关联数组,这意味着数组索引本身是有意义的,可以用来检索您正在搜索的正确内容,只需花费 O(1) 的时间。

      例如,可以将一个轨道跑步者列表存储在一个数组中,其中数组索引等于轨道编号。如果您想可视化每个轨道的跑步者的名字,这是一个完美的数据结构。如果您想按字母顺序对所有跑步者的姓名进行排序,这是一个糟糕的数据结构。

      但是根据您的应用程序描述,数组索引对您没有任何意义。这表明数组不是最佳选择。

      【讨论】:

        【解决方案4】:

        如果您不确定在运行时插入了多少条目,我建议您使用链表数据结构。它将节省您的内存使用量。

        【讨论】:

        • 搜索链表是O(n)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多