缺少C中的数组数据

时间:2014-09-19 18:55:18

标签: c arrays memory-management

我有一个代码,它创建一个包含1000个随机条目的数组,以及一个将它们分成直方图的例程。当我看到直方图的结果时,我发现有比实际应用更多的0。我可以调试代码,我发现虽然我的原始数组似乎是正确的,但是在我将数组传递给下一个例程之后,最后几个条目现在为0.此外,如果我在同一例程中再运行几行,甚至更多条目变为0.有没有人知道可能导致这种情况的原因是什么?

以下是供参考的代码:

int n = 1000;
int m = 100;
double r;
double *p;//line 22
p = generate_random( n ); //returns array of length n containing random numbers between 0 and 1
r = group(p, m, n);  
...
double group(double* rnd, int m, int n)
{
   int count[100] = { 0 };
   int length = n;
   int i, bin;//line 66
   double dx = 1/(double) m;//length of each interval

   for (i = 0; i < length; i++)
   {
       bin = (int) floor(*(rnd+i)/dx);//line 71
       count[bin]++;//count[0] should be the number of random elements between 0 and 0.1
   }
...//some more code that sets return double

当我在创建p之后在第22行进入调试器时,我可以看到p包含1000个随机数:

print *p = 0.78846
print *(p+851) = 0.3475
print *(p+999) = 0.9325

在第66行,它包含较少的内容:

print *rnd = 0.78846
print *(rnd+851) = 0.3475
print *(rnd+999) = 0

在第71行(i = 0)甚至更少:

print *rnd = 0.78846
print *(rnd+851) = 6.9533e-310
print *(rnd+999) = 0

编辑:这是generate_random:

的代码
double * generate_random( int  n )
{
   const unsigned int a = 1664525;
   const unsigned int b = 1013904223;
   const unsigned int M = pow(2,32);

   int i;
   double random_numbers[n];

   unsigned int rnd = time(NULL)%M; //number of seconds since 00:00 hours, 
                                // Jan 1, 1970 UTC

   for (i = 0; i < n; i++)
   {
      rnd = (a*rnd + b)%M;
      random_numbers[i] = (double) rnd;

      //map to [0,1]
      random_numbers[i] = random_numbers[i]/M;
   }


   return random_numbers;
}

1 个答案:

答案 0 :(得分:4)

您将random_numbers分配为将其放置在堆栈上的本地。返回时,不再保留该存储,因此未定义结果。相反,要么在堆malloc(sizeof(double)*n)上分配数组,要么更好地在调用者中分配数组并将数组传递给generate_random函数,该函数可以填充它。如果你在堆上分配,那么一定要确定完成后释放它。