在c

时间:2017-11-11 21:50:52

标签: c windows segmentation-fault

我已经没有希望和想法了。我一直试图调试这个简单的代码,它应该在文件中创建一个简单的表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);
}

3 个答案:

答案 0 :(得分:1)

指向浮动f1f2的指针未初始化。 使它们成为简单的浮点变量,并使用地址运算符

传递它们
float f1, f2;
calc23(x, &f1, &f2);
printf("..", f1, f2);

答案 1 :(得分:0)

简单调试代码:  f1和f2未初始化

答案 2 :(得分:0)

以下提议的代码:

  1. 干净地编译
  2. 不会出错,因为没有未定义的行为导致seg故障
  3. 正确检查系统功能中的错误
  4. 记录每个头文件包含的原因
  5. 更正评论中列出的问题
  6. 选择使用powf()而不是pow(),因此所有值(和文字)都有float
  7. 类型

    现在建议的代码:

    #include <stdio.h>   // fopen(), fclose(), fwrite(), FILE
    #include <stdlib.h>  // exit(), EXIT_FAILURE
    #include <math.h>    // powf()
    
    // prototypes
    void calc23(float x, float *f1, float *f2);
    
    
    int main( void )
    {
        FILE *datf = fopen("mydatatable.data", "w");
        if( !datf )
        {
            perror( "fopen to write mydatatable.data failed");
            exit( EXIT_FAILURE );
        }
    
        // implied else, fopen successful
    
        float f1;
        float f2;
        float r = -2.0f;
    
        for(int i=1; i<100; i++)
        {
            calc23(r, &f1, &f2);
            fprintf(datf, "%f %f %f \n", r, f1, f2);
            r += (4.0f/99.0f);
        }
        fclose(datf);
    }
    
    
    void calc23(float x, float *f1, float *f2)
    {
        *f1 = powf(x,2.f)-4.0f*x+8.0f;
        *f2 = powf(x,3.f)+2.0f*x;
    }
    

    该计划输出的前几行:

    -2.000000 20.000000 -12.000000 
    -1.959596 19.678400 -11.444072 
    -1.919192 19.360065 -10.907337 
    -1.878788 19.044994 -10.389402 
    

    该计划输出的最后几行:

    1.838385 4.026119 9.889888 
    1.878789 4.014692 10.389421 
    1.919193 4.006530 10.907358 
    1.959597 4.001633 11.444093