为啥这个程序会崩溃? [关闭]

Posted

技术标签:

【中文标题】为啥这个程序会崩溃? [关闭]【英文标题】: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> 蝉,调试器用什么? 这里有太多不好的编码习惯,而您提供的信息太少,无法分辨。使用调试器(如建议的那样)查看崩溃发生的位置。然后问。 【参考方案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

【讨论】:

以上是关于为啥这个程序会崩溃? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

为啥我打开应用程序时应用程序崩溃? [关闭]

为啥flutter release apk会崩溃? [关闭]

为啥我的 Qt 应用程序无故崩溃? [关闭]

为啥关闭 translatesAutoResizingMasks 会导致自动布局崩溃,抱怨我需要调用 [super layoutSubviews]?

MFC为啥一关闭对话框就系统崩溃 弹出英语说某个地址不可写。。。?

为啥这个程序会在 C 中给出 Invalid memory access 错误? [关闭]