【问题标题】:Why does this program crash? [closed]为什么这个程序会崩溃? [关闭]
【发布时间】:2013-02-04 21:34:53
【问题描述】:

我需要运行它,以便分析我实验室的一些数据。但是,当程序运行并且我输入“n”的值时,它只会崩溃。有关如何纠正此问题的任何提示?

谢谢,代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>


int main()
{
  FILE *magfield;
  FILE *means;
  FILE *variances;
  double *mean;
  double *variance;
  double field[12000];
  double time[12000];
  double sum=0, squares=0;
  int i, j=0, k=0, l=0, n=0;
  magfield=fopen("C:\\Users\\Owner\\Documents\\Homework\\ILab\\magneticfield.txt","r");
  means=fopen("C:\\Users\\Owner\\Documents\\Homework\\ILab\\means.txt","w");
  variances=fopen("C:\\Users\\Owner\\Documents\\Homework\\ILab\\variances.txt","w");

  for (i=0;i<12000;i++)
  {
       fscanf(magfield,"%f %f", &time[i], &field[i]);
       //printf("%f %f\n", time[i], field[i]);
  }

  printf("How many data points would you like to be analyzed at a time?\n");
  scanf("%i", &n);

  mean=(double*)calloc(n,sizeof(double));
  variance=(double*)calloc(n,sizeof(double));

  for (i=0;i<12000;i+=n)
  {
      for(j=i;j<n;j++)
      {
          sum+=field[j];
          squares+=field[j]*field[j];
      }
      mean[k]=sum/n;
      variance[k]=squares/n-(mean[k]*mean[k]);
      fprintf(means,"%f\n", mean[k]);
      fprintf(variances,"%f\n", variance[k]);
      sum=0;
      squares=0;
      k++;
  }
  free(mean);
  free(variance);
  printf("Press enter to continue...\n");
  getch();  
  return 0;
}

【问题讨论】:

  • 什么是“崩溃消息”?
  • 提示:使用调试器。
  • 问题签名:问题事件名称:APPCRASH 应用程序名称:Lab3.exe 应用程序版本:0.0.0.0 应用程序时间戳:51241b06 故障模块名称:ntdll.dll 故障模块版本:6.1.7601.17725 故障模块时间戳: 4EC49B8F异常代码:C0000005异常偏移量:0003331F OS版本:6.1.7601.2.1.0.256.48区域设置:1033附加信息1:0A9E附加信息2:0A9E372D3B4AD19135B953A7882E789附加信息3:0A9E附加信息4:0A9E372D3B4AD19135B953A78882E789 SPAN>
  • 蝉,调试器用什么?
  • 这里有太多不好的编码习惯,而您提供的信息太少,无法分辨。使用调试器(如建议的那样)查看崩溃发生的位置。然后问。

标签: c crash physics


【解决方案1】:

我建议在你的 fopen 之后使用 #include &lt;assert.h&gt;assert(magfield != NULL); assert(means != NULL); assert(variances != NULL);。此外,您可能应该assert(fscanf(...) == 2);assert(scanf(...) == 1);。这些是调试辅助工具:如果出现任何故障,您就会知道这是因为缺少文件或意外输入。 assert(mean != NULL); assert(variance != NULL); 确保分配成功。您可以提出哪个断言来确保 k 始终小于 n?当 k 是均值或方差的无效索引时,如何确保不访问均值 [k] 或方差 [k]?

this page 告诉您%f 格式说明符处理的类型是什么? &amp;time[i]&amp;field[i] 的类型是什么?这些问题的答案应该相同,否则您将处理未定义的行为。

您为什么要使用非标准 conio.h 中的非便携式 getch,而您可以将标准 stdio.h 中的便携式 getchar 用于相同目的?

【讨论】:

    【解决方案2】:

    meanvariance 数组的大小有误。您将它们分配为大小为 n 的元素,但随后您就有了外循环:

    for (i = 0; i < 12000; i += n)
    {
        ...
        mean[k] = sum/n;
        variance[k] = squares/n - (mean[k]*mean[k]);
        ...
        k++;
    }
    

    循环体将执行12000/n 次,对于小于12000 (110) 的平方根的任何n 将导致超过n 的迭代次数,因此k 会变大足以使超出两个数组末尾的越界访问发生。

    在完全不同的通知中,您的内部循环似乎不正确。也许应该是:

    for (j = i; j < i+n; j++)
    {
       sum += field[j];
       squares += field[j]*field[j];
    }
    

    (您还必须确保i+n 不大于12000

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-01
      • 2023-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多