通过指针调整数组大小

时间:2019-07-03 20:14:31

标签: c++ arrays pointers

我正在调整方法内部数组的大小,但是由于我使用的是指针,因此内存地址现在不正确。 diffDataTot指针最初是在main()中创建的,然后传递到calculateField()方法中。 calculateField()方法包含需要添加到diffDataTot的新信息,并且需要删除一些旧信息。我使用resize()方法调用对此进行了说明。

void calculateField(diffData* diffDataTot){
    diffData* filler = (diffData*)malloc(newSize * sizeof(diffData));
    filler = resize(newSize, diffDataTot);
    free(diffDataTot);
    diffDataTot = filler;
    free(filler);
}

int main{
    diffData* diffDataTot = (diffData*)malloc(sizeof(diffData));
    calculateField(diffDataTot);
}

我不得不缩写它,因为它来自数千行的全面模拟。但是,问题在于diffDataTotcalculateField()方法内部包含正确的信息。但是指针指向的内存地址不同于main()中的地址。我可以尝试不使用指针,但是我想避免每次调用calculateField()时复制整个数组,因为它很大。

我有什么办法可以通过calculateField()方法传回数组中第一个元素的内存?

1 个答案:

答案 0 :(得分:2)

您需要传递指针的地址(指针指向指针)。

void
resizing_func(int **elements,
              int *elem_count)
{
  //---- get rid of additional indirection ----
  int *p=*elements;
  int count=*elem_count;
  //---- work with local variables ----
  // ...
  int new_count=2*count; // whatever is needed for the problem
  p=realloc(p, new_count*sizeof(int));
  // ...
  //---- make changes visible in calling context ----
  *elements=p;
  *elem_count=new_count;
}

void
testing_func(void)
{
  int count=100;
  int *elements=malloc(count*sizeof(int));
  // populate elements
  resizing_func(&elements, &count);
  // use updated elements and count
}

根据问题,realloc()可以替换为:

  • 分配第二个缓冲区,
  • 使用第一缓冲区和第二缓冲区,
  • 释放第一个缓冲区,然后继续第二个缓冲区,

如OP的问题。
(顺便提一下,free(filler)将释放打算保留在diffDataTot中的内容)

注意:由于该问题被标记为c++,因此最好使用std::vector并通过(非const)引用传递它;但是提供的源代码看起来像c