0

如果这是一个初学者的问题,我很抱歉——我的大部分编程都是使用非常高级的语言,而我在 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));

但这似乎也不起作用。

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

4

3 回答 3

3

在 之外分配数组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 更新。

于 2012-08-01T12:50:11.543 回答
0

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

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);
于 2012-08-01T12:56:30.820 回答
-1

你应该使用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 它仍然是正确的

于 2012-08-01T13:06:55.117 回答