【问题标题】:Missing array data in CC中缺少数组数据
【发布时间】:2014-09-19 18:55:17
【问题描述】:

我有一个代码可以创建一个包含 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;
}

【问题讨论】:

  • 显示随机生成代码。我有一个怀疑。
  • @DrC:完成,见编辑
  • 您发布的代码看起来很合理。您可以发布generate_random() 的代码吗?问题可能在于您如何创建数组。
  • 对不起,为什么,如果您使用的是允许非常量数组大小自动声明的编译器(当您在 generate_random() 中使用它们时(声明 double random_numbers[n];n 函数的参数) 不要在第一个函数group() 中对int count[n]; ---而不是int count[100];--- 做同样的事情?这样你就不会犯尺寸错误。
  • 这只是我想要的最终代码外观的粗略草图。当我尝试设置 int count[n] 时,编译器出错了,所以我想我先让它编译并工作,然后再担心类似的事情。

标签: c arrays memory-management


【解决方案1】:

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

【讨论】:

  • ……而且你在分配内存的时候也要记得释放它,以免内存泄漏。
  • 将第二次出现的“stack”改为“heap”。
  • 太好了,谢谢。我猜很容易修复;仍然习惯于 C 中的内存管理。
猜你喜欢
  • 1970-01-01
  • 2019-10-15
  • 1970-01-01
  • 1970-01-01
  • 2012-11-25
  • 1970-01-01
  • 2014-03-14
  • 2020-06-08
  • 2020-07-24
相关资源
最近更新 更多