【问题标题】:C - Storing values in array in a functionC - 将值存储在函数中的数组中
【发布时间】:2014-04-20 15:54:43
【问题描述】:

问题:有没有办法在函数内存储(malloc/free)一个数组,这样如果我在主函数中多次调用该函数,它会调用我上次调用它时生成的数组。

详情:我需要用原型创建一个函数:

double* Wee(int N)

返回一个大小为 N 的数组。

该函数被重复调用以增加 N 的不同值。 假设 N = 4,那么数组值是这样的:

0.02 0.45 0.21 0.38

如果 N 现在等于 6,则数组值为:

0.02 0.45 0.21 0.38 0.56 0.81

有什么方法可以让函数记住这 4 个值:0.02 0.45 0.21 0.38,这样当我下次调用 N = 6 的函数时,就不需要再次计算这些值了?

目前我的 N=6 数组如下所示:

-6.27744e+066 -6.27744e+066 -6.27744e+066 -6.27744e+066 0.56 0.81

【问题讨论】:

  • 使用 realloc()。它为你做了很多。
  • @JoachimPileborg 非常感谢!这正是我所需要的。
  • @Jim 谢谢吉姆。我已经以静态方式找到了我的解决方案,但我尝试使用 realloc 并且现在在一天之内学到了两件事。非常感谢!

标签: c arrays function


【解决方案1】:

问题已经在 cmets 中得到解答,但这里有一个实现:

#include <ansi_c.h>

double * wee(int N);

int main(void)
{

    double * x;
    x = wee(4);
    //use x somehow;
    free(x);
    x = wee(6);
    //use x somehow;
    free(x);
    return 0;   
}

double * wee(int N)
{
    static int firstIn=1;
    int i;
    double *value;
    static double *previousValue;
    static int previousN = 0;

    srand(clock());

    value = malloc(sizeof(double)*N);

    //populate newly reallocated value with previousValues up to previousN
    for(i=0;i<previousN;i++)
    {
        value[i] = previousValue[i];    
    }

    //reallocate previousValue array to new size
    if(firstIn) 
    {
        previousValue = malloc(sizeof(double)*N);
        firstIn = 0;//do this only once
    }
    else
    {
        previousValue = realloc(previousValue, N);  
    }

    //now you are ready to put fresh numbers into newest elements of array
    for(i=previousN;i<N;i++)
    {
        value[i] = (double)rand();//populate only new array elements
        previousValue[i]=value[i];
    }
    previousN = N;


    return value;
}

注意:释放 double * previousValue 可以通过传递额外的参数来完成,例如 double *wee(int N, BOOL cleanup);
然后你可以为 N 传递 0,为你的最后一次调用传递 TRUE。编写函数以绕过除清理和返回之外的所有代码。

if(cleanup)
{
    free(previousValue);
}

【讨论】:

    猜你喜欢
    • 2012-04-23
    • 2019-10-13
    • 1970-01-01
    • 1970-01-01
    • 2013-09-29
    • 1970-01-01
    • 1970-01-01
    • 2021-11-28
    • 1970-01-01
    相关资源
    最近更新 更多