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



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

并主要定义其大小:

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

但这似乎也不起作用。

不管怎样,我会非常感谢你的建议——我想我已经耗尽了谷歌的优秀之处。

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

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

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中维护原始数据,这将起作用。

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

int * myVar = (int *)malloc(m * sizeof(int));
update(myVar, m);
// Other work to be done
free(myVar);

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

相关内容

  • 没有找到相关文章

最新更新