C:我需要一个接受并返回可变大小数组的函数

时间:2012-08-01 12:46:31

标签: c arrays function malloc

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

但这似乎也不起作用。

无论如何,我会非常感谢一些建议 - 我认为我已经筋疲力尽了谷歌的优秀。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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回答将更适合您。

另外请记住,在更新例程之前和之前,你必须将任何你希望输入的变量malloc,并在其他任何时候释放。

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

update(myVar, m);

// Other work to be done

free(myVar);

答案 2 :(得分:-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它仍然是正确的