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