为啥这个程序会崩溃? [关闭]
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 <assert.h>
和 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
格式说明符处理的类型是什么? &time[i]
和 &field[i]
的类型是什么?这些问题的答案应该相同,否则您将处理未定义的行为。
您为什么要使用非标准 conio.h 中的非便携式 getch,而您可以将标准 stdio.h 中的便携式 getchar 用于相同目的?
【讨论】:
【参考方案2】:mean
和 variance
数组的大小有误。您将它们分配为大小为 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会崩溃? [关闭]
为啥关闭 translatesAutoResizingMasks 会导致自动布局崩溃,抱怨我需要调用 [super layoutSubviews]?