如果这是一个初学者的问题,我很抱歉 - 我的大部分编程都是非常高级的语言,而且我在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));
但这似乎也不起作用。
无论如何,我会非常感谢一些建议 - 我认为我已经筋疲力尽了谷歌的优秀。
答案 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它仍然是正确的