【发布时间】:2017-11-11 21:50:52
【问题描述】:
我已经失去了希望和想法。我一直在尝试调试这个简单的代码,它应该在文件中创建一个简单的表,为期 3 天。运行它时,我总是遇到分段错误。我是 c 新手,但我知道分段错误是什么。我似乎无法在这里修复它。运行编译后的代码时,它确实创建了一个具有正确名称的空文件,但随后发生了错误,我保留了一个新但完全为空的文件。所以我猜这个问题在 fopen 和第一个 fprintf 之间。有什么想法吗?
#include <stdio.h>
#include <math.h>
void calc23(float x, float *f1, float *f2){
*f1 = pow(x,2)-4.0*x+8.0;
*f2 = pow(x,3)+2.0*x;
}
void main(){
FILE *datf;
datf = fopen("mydatatable.data", "w");
float *f1, *f2;
float r = -2.0;
for(int i=1; i<100; i++){
calc23(r, f1, f2);
fprintf(datf, "%f %f %f \n", r, *f1, *f2);
r += (4.0/99.0);
}
fclose(datf);
}
【问题讨论】:
-
我可以问 f1、f2 并指向什么吗?你没有初始化它。结果和访问冲突(分段错误不是 Windows 字)
-
float f1, f2; calc23(r, &f1, &f2); fprintf(datf, "%f %f %f \n", r, f1, f2);应该是 -
该函数只有两个有效签名:
main()1)int main( void )和 2)int main( int argc, char *argv[] )无论 Visual Studio 允许什么 -
函数:
pow()使用所有double值。但发布的代码中的所有变量都是float类型。您可以尝试使用powf()并将所有文字更改为float或将所有变量更改为double -
关于:
float *f1, *f2;这些被声明为指针,但它们从未设置为指向应用程序拥有的内存。到如下语句:*f2 = pow(x,3)+2.0*x;正在设置一些随机内存位置(变量(f1 和 f2)所在的堆栈上发生了什么。这是未定义的行为,可能导致段错误事件。(如您所见)看过)
标签: c windows segmentation-fault