用随机数填充数组

时间:2012-12-08 17:32:26

标签: c arrays function pointers

目前我正在尝试使用随机值填充大小 num 的数组。为此,我需要创建两个函数:

1:编写一个函数(* createdata),分配 num 双精度值的动态数组,将值初始化为0.0。

2:编写一个不同的函数(gendata),它将使用rand()函数生成的随机值填充double值数组。

这是我尝试编写函数如何操作(在main()之外)

double *createdata(int num)
  {
         int i = 0;

         double *ptr;

         ptr = (double *)malloc(sizeof(double)*num);     

         if(ptr != NULL)
         {
           for(i = 0; i < num; i++)
           {
                 ptr[i] = 0.0;       
           }
         } 
  }  

double gendata(int num)
  {

         createdata(num); 

         int j = 0;

         for(j = 0; j < num; j++)
           {
                 ptr[j] = rand();       
           }               
  }

但是,我知道上述内容肯定有问题。

我想要的是,一旦我在main中调用了两个函数,我将生成一个大小为 num 的数组,其中填充了随机数。

4 个答案:

答案 0 :(得分:2)

你必须将分配的指针传递给gendata函数,因为在它的当前形式中,ptr是未知的。那甚至可以编译吗?

示例:

double *createdata(int num)
{
    int i = 0;
    double *ptr;

    ptr = (double *)malloc(sizeof(double)*num);

    if(ptr != NULL)
    {
        for(i = 0; i < num; i++)
        {
            ptr[i] = 0.0;
        }
    }
    return ptr;
}

double gendata(int num)
{
    double *ptr = createdata(num);
    int j = 0;

    if(ptr != NULL)
    {
        for(j = 0; j < num; j++)
        {
            ptr[j] = rand();
        }
    }
}

另请注意,我正在检查来自NULL的返回malloc

其他人可能会在此处提出的其他提示:

  • Don't cast the return of malloc
  • 完全使用后,请不要忘记free指针。
  • 您没有在函数gendata中返回任何内容,但您将其声明为double。如果您不打算返回任何内容,请使用void

但是你可能还需要从它返回指针,这样你以后可以在其他函数中使用它,例如main

编辑:所以,这就像这样,例如:

double *gendata(int num)
{
    double *ptr = createdata(num);
    int j = 0;

    if(ptr != NULL)
    {
        for(j = 0; j < num; j++)
        {
            ptr[j] = rand();
        }
    }
    return ptr;
}

在您的main

int main(void)
{
    double *data;
    data = gendata(100);
    printf("%g\n", data[5]);

    // When you're done, call free
    free(data);
    return 0;
}

答案 1 :(得分:0)

您需要返回createdata()函数中分配的数组,否则您无法在gendata()或其他任何地方使用它。

我不确定为什么gendata()被声明为返回double。

答案 2 :(得分:0)

好吧,我不太熟悉malloc的工作方式,虽然看起来效果很好,所以我无法评估,但我能看到的唯一问题是:

您没有在ptr函数中返回createdata。因此,当您尝试访问ptr函数中的gendata时,范围内没有ptr数组。这会给你一个错误。此外,gendata函数甚至不返回任何内容。

看看这段代码,这应该可行:

double *createdata(int num)
{
     int i = 0;

     double *ptr;

     ptr = (double *)malloc(sizeof(double)*num);     

     if(ptr != NULL)
     {
       for(i = 0; i < num; i++)
       {
             ptr[i] = 0.0;       
       }
     } 
     return ptr; // return the pointer
  }  

double *gendata(int num) // you forgot the '*' here
{

     double *ptr = createdata(num); 

     int j = 0;

     for(j = 0; j < num; j++)
       {
             ptr[j] = rand();       
       }     
     return ptr; // i added this so you obviously return the pointer 
  }

我相信这会奏效,这是一个使用它的例子:

int main()
{
    int c;
    double *data = gendata(8);
    for(c = 0; c < 8; c++)
    {
        printf("%f\n", data[c]);
    }
}

答案 3 :(得分:0)

在createdata()中,你忘了在最后实际返回指向新分配数组的指针:

return ptr;

此外,您的gendata()函数需要处理现有的数组,而不是生成自己的数组。您应该将其添加为参数。此外,它不需要返回任何东西。所以:

void gendata(double ptr[], int num)
{
    int j = 0;
    if (ptr != NULL) {
        for(j = 0; j < num; j++) {
            ptr[j] = rand();
        }
    }
}

但是,您可以简化上述操作并降低嵌套级别:

void gendata(double ptr[], int num)
{
    int j = 0;
    if (ptr == NULL)
        return;

    for(j = 0; j < num; j++) {
        ptr[j] = rand();
    }
}

请注意,double ptr[]实际上与double* ptr相同,但[]语法使得函数想要的是指向双精度数组而不是指针数的指针更明显到一个double

所以现在为了创建一个数组然后将其随机化,你可以这样做:

double* array = createdata(N); // Create an array of N doubles.
gendata(array, N); // Randomize it.