【问题标题】:C: I need a function which will accept and return a variably sized arrayC:我需要一个函数来接受并返回一个可变大小的数组
【发布时间】:2012-08-01 12:46:31
【问题描述】:

如果这是初学者的问题,我深表歉意 - 我的大部分编程都是使用非常高级的语言,而我在 C 方面的专业知识有限。(这是我可以用 Matlab 等语言轻松完成的事情, Octave, Sage, Maxima 等,但为此我需要 C) 的速度。

但无论如何...我有一个数组,其大小是在运行时使用 malloc 设置的:

int *A = malloc(m * sizeof(int));

其中 m 是根据用户提供的一些值计算得出的。我有一个更新数组的函数“update”(或者,如果您愿意,可以将数组作为输入并返回另一个作为输出)。此更新函数可能会被调用 10^8 次以上。

所以函数本身不能用malloc引入大小合适的输出数组,否则内存会被用完。所以,例如,我不能这样做:

int * update(int *L) /* produces next iteration of L */
{
  int *out = malloc(m * sizeof(int));
  /* do some stuff with L and produce new array out */
  return (out);
}

我试图在更新函数之外找出一个静态变量:

static int *out;

并在 main: 中定义其大小:

out = malloc(m * sizeof(int));

但这似乎也不起作用。

无论如何,我会非常感谢一些建议 - 我想我已经用尽了谷歌的卓越之处。

【问题讨论】:

  • 你是free()使用后的内存吗?
  • 内存将用完:不再需要时只需free()。

标签: c arrays function malloc


【解决方案1】:

在update之外分配数组,然后传递一个指向它的指针:

void update(int const *L, int *out)
{
    // whatever
}

调用为

int *A = malloc(m * sizeof(int));
if (A == NULL)
    // handle error

for (i=0; i < N_ITER; i++)
     update(L, A);

尽管您可能想要重新设计程序以便它更新L就地。

【讨论】:

  • 非常感谢 - 这是似乎效果最好的一个,我可以用最少的程序来应用它。我在一些之前导致内存崩溃的值上对其进行了测试,在我得到结果之前,更新函数被调用了大约 200,000,000 次。再次感谢!
【解决方案2】:

因此,如果您只是想处理直接进入函数的数据,那么您所拥有的部分已经是正确的。我唯一要做的就是将数组的大小作为输入参数添加到例程中,如下所示:

void update(int * L, unsigned int size){
    unsigned int count;

    // Make sure the array has actually been allocated from outside
    if(L == NULL) return;

    // Example work on L just as if it is an array of values
    for(count = 0; count < size; count++){
        L[count] = L[count] + 1;
    }
}

请记住,如果您不希望在 L 中维护原始数据,这将起作用。如果您确实希望维护原始数据,那么 larsmans 的答案对您来说会更好。

还请记住,您必须在更新例程之外和之前将要输入到 L 中的任何变量进行 malloc,并在其他时间释放。

int * myVar = (int *)malloc(m * sizeof(int));

update(myVar, m);

// Other work to be done

free(myVar);

【讨论】:

    【解决方案3】:

    你应该使用realloc。

    int *a = realloc(a, m * sizeof(a[0]));
    

    它在第一次运行时会像malloc 一样工作,但随后它会重新分配一个不同大小的数组。您应该注意,新数组中可能有也可能没有之前分配的值。你应该假设它像malloc 给出的所有东西一样有垃圾。

    这里是使用realloc的一个很好的解释。

    http://www.java-samples.com/showtutorial.php?tutorialid=589

    注意:sizeof(a[0]) 等于 sizeof int 但如果你改变 int 它仍然是正确的

    【讨论】:

    • OP 的问题中没有任何内容表明数组大小在更新之间发生变化(在典型的迭代数字运算算法中,这种变化很少见)。此外,realloc 会复制/保留数组中先前的值。
    • 当我需要调整数组的大小时,我使用了 realloc,但这里不需要。哦,对于 python,如果 L 是一个列表,那么 L += [val] 只是将新值附加到它。
    猜你喜欢
    • 2016-02-27
    • 1970-01-01
    • 1970-01-01
    • 2021-11-28
    • 1970-01-01
    • 1970-01-01
    • 2019-02-17
    • 1970-01-01
    • 2021-05-15
    相关资源
    最近更新 更多