动态数组分配混淆

时间:2015-09-01 18:26:51

标签: c arrays dynamic dynamic-arrays

我将读取用户的几个值并将其存储在数组中。然后我需要创建一个足以存储所有这些值的数组。使用我编写的一些函数,我通过数组对给定值进行sort / lsearch / bsearch。

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

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

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

  1. 当用户首次输入值
  2. 当我将arr1复制到一个新的arr2时,它需要足够大以容纳所有arr1的值。
  3. 我对此是对还是错?

4 个答案:

答案 0 :(得分:1)

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

当您正在读取值时,如果您的数组不够大,那么用户realloc可以将数组的大小加倍。

答案 1 :(得分:0)

我想你提出了错误的问题。

问题是:
动态数组(连续的内存块)是保存和处理应用程序中数据的正确数据结构吗?

数组只有一个特别有用的应用程序,它是关联数组,这意味着数组索引本身具有意义,可以用来检索正在搜索的正确内容,并努力使用O(1)。

在示例中,轨道运行器列表可以存储在数组中,其中数组索引等于轨道号。如果您想要显示每个轨道的跑步者名称,这是一个完美的数据结构。如果你想按字母顺序对所有参赛者的名字进行排序,这是一个糟糕的数据结构。

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

答案 2 :(得分:0)

最好的解决方案是每次用户输入值时都不要复制整个数组。对malloc和free的要求会很高,而对于更大的阵列则会变得更糟。

您需要使用“元素数量作为输入

来计算数组的大小

int * array = newArray(10);

int * newArray(int size){    return malloc(size * 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 :(得分:0)

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