Ошибка сегментации при использовании fclose()

#c #segmentation-fault

#c #ошибка сегментации

Вопрос:

Я новичок в C и пытаюсь записать свои выходные данные в файл. Кажется, что я получаю ошибку сегментации при попытке закрыть выходные файлы. Я выполнил те же шаги, что и в некоторых примерах, чтобы открыть файл и выделить память.

Заранее спасибо за вашу помощь. Это код:

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

#define pi      4*atan(1)

FILE  *my_file_1; // Output file (*.txt)
FILE  *my_file_2; // Output file (*.txt)

int main()
{
    int nx, ny, npts;
    int niter;


    double dt, w, height, d_o, h, factork, dVol;
    double rho_o, g, lamda, po, co, p1, p2, r; // Fluid Properties


    double *x, *y, *u, *v, *du, *dv, *rho, *drho, *p, *m;
    double en_x, en_y, dw, dwx, dwy, sum1, sum2, sum3;
    int i, j, k;


    //Parameters

    height = 0.2;  //Height
    w = 0.1;  //width
    nx = 20;  //Number of particles x-dir
    ny = 40;  //Number of particles y-dir
    npts = nx*ny;// Total number of particles
    d_o = w / nx; // Distance between particles
    dt = 0.00002;
    dVol = 4 * pow((d_o / 2), 2);

    // boundary
    double L,height_wall,*xw1,*xw2,*xb,*yw1,*yw2,*yb;
    int nyw1,nyw2,nxb;
    int nrows,np1,np2,npb;

    L=0.8;
    height_wall=0.4;
    nrows=3;

    nyw1=height_wall/d_o;
    nyw2=height_wall/d_o;
    nxb=L/d_o;
    np1=nrows*nyw1;
    np2=nrows*nyw2;
    npb=nrows*nxb;
     printf("%dn",npb);
    // getchar();


    h = 1.33*d_o; // Smoothing length
    factork = 2; //Constant for kernell

    //Fluid
    rho_o = 1000;
    g = 9.81;
    lamda = 1;
    po = 101325;
    co = 30;

    x = (double*)malloc(npts*sizeof(int));
    y = (double*)malloc(npts*sizeof(int));
    u = (double*)malloc(npts*sizeof(int));
    v = (double*)malloc(npts*sizeof(int));
    rho = (double*)malloc(npts*sizeof(int));
    du = (double*)malloc(npts*sizeof(int));
    dv = (double*)malloc(npts*sizeof(int));
    drho = (double*)malloc(npts*sizeof(int));
    p = (double*)malloc(npts*sizeof(int));
    m = (double*)malloc(npts*sizeof(int));

    //boundaries
    xw1 = (double*)malloc(np1*sizeof(int));
    yw1= (double*)malloc(np1*sizeof(int));
    xw2 = (double*)malloc(np2*sizeof(int));
    yw2= (double*)malloc(np2*sizeof(int));

    xb = (double*)malloc(npb*sizeof(int));
    yb= (double*)malloc(npb*sizeof(int));


    my_file_1 = fopen("org.txt", "w");
    my_file_2 = fopen("bound.txt", "w");

// Particles
    for (i = 0; i<ny; i  )
    {
        for (j = 0; j<nx; j  )
        {
            x[nx*i   j] = d_o / 2   j*d_o;
            y[nx*(i) j] = d_o / 2   i*d_o;
            // printf(" .18f  .18fn",x[nx*i j],y[nx*(i) j]);
            //printf("%7.4f %7.4fn ", x[nx*i   j], y[nx*(i) j]);
            fprintf(my_file_1, "%7.4f %7.4fn ", x[nx*i   j], y[nx*(i) j]);

        }
    }



    //Boundries

    //Left wall

    for (i = 0; i<nyw1; i  )
    {
        for (j = 0; j<nrows; j  )
        {
            xw1[nrows*i   j] = -L/2 d_o / 2   j*d_o;
            yw1[nrows*(i) j] = d_o / 2   i*d_o;
            // printf(" .18f  .18fn",x[nx*i j],y[nx*(i) j]);
            //printf("%7.4f %7.4fn ", x[nx*i   j], y[nx*(i) j]);
            fprintf(my_file_2, "%7.4f %7.4fn ", xw1[nrows*i   j], yw1[nrows*(i) j]);

        }
    }

     //Right wall

    for (i = 0; i<nyw2; i  )
    {
        for (j = 0; j<nrows; j  )
        {
            xw2[nrows*i   j] = L/2-4*d_o 3*d_o / 2   j*d_o;
            yw2[nrows*(i) j] = d_o / 2   i*d_o;
            // printf(" .18f  .18fn",x[nx*i j],y[nx*(i) j]);
            //printf("%7.4f %7.4fn ", x[nx*i   j], y[nx*(i) j]);
            fprintf(my_file_2, "%7.4f %7.4fn ", xw2[nrows*i   j], yw2[nrows*(i) j]);

        }
    }

        //Bottom wall
            for (i = 0; i<nrows; i  )
    {
        for (j = 0; j<nxb; j  )
        {
            xb[nxb*i   j] = -L/2 d_o/2   j*d_o;
            yb[nxb*i j] = -4*d_o / 2  i*d_o;
             //printf("%d %dn",i,j);
             printf("%d %dn",i,j);
             printf(" .18f  .18fn",xb[nxb*i j],yb[nxb*(i) j]);
            //printf("%7.4f %7.4fn ", x[nx*i   j], y[nx*(i) j]);
            fprintf(my_file_2, "%7.4f %7.4fn ", xb[nxb*i   j], yb[nxb*(i) j]);

        }
    }

fclose(my_file_1)
fclose(my_file_2)
}
  

Комментарии:

1. Почему вы используете malloc и используете sizeof int

2. Для начала, x = (double*)malloc(npts*sizeof(int)); это большая ошибка, и 15 других подобных строк. Я предлагаю вам внимательно прочитать код, строка за строкой.

3. fopen() может произойти сбой!!! Проверьте возвращаемое значение fopen() : если это так NULL , то файл не открыт. См. cplusplus.com/reference/cstdio/fopen

Ответ №1:

Ниже приведена переработка вашего кода с исправленными выделениями памяти, а также исправлены ошибки, из-за которых ваш код не компилировался! И множество изменений стиля. Я также удалил весь неактивный код, что является хорошей идеей при отправке программ, чтобы люди могли сосредоточиться на проблемах. Я также завернул ваши fopen() fclose() вызовы and с проверкой ошибок, поэтому, если есть другая проблема, вы должны получить дополнительную информацию. Приведенный ниже код выполняется до завершения без ошибок:

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

#define pi (4 * atan(1))

#define ORG_FILE_NAME "org.txt"
#define BOUND_FILE_NAME "bound.txt"

int main()
{
    // Parameters

    double w = 0.1; // Width
    int nx = 20; // Number of particles x-dir
    int ny = 40; // Number of particles y-dir
    int npts = nx * ny; // Total number of particles
    double d_o = w / nx; // Distance between particles

    // Boundary

    double L = 0.8;
    double height_wall = 0.4;
    int nrows = 3;

    int nyw1 = height_wall / d_o;
    int nyw2 = height_wall / d_o;
    int nxb = L / d_o;

    int np1 = nrows * nyw1;
    int np2 = nrows * nyw2;
    int npb = nrows * nxb;
    printf("%dn", npb);

    // Fluid

    double *x = calloc(npts, sizeof(double));
    double *y = calloc(npts, sizeof(double));

    // Boundaries

    double *xw1 = calloc(np1, sizeof(double));
    double *yw1 = calloc(np1, sizeof(double));
    double *xw2 = calloc(np2, sizeof(double));
    double *yw2 = calloc(np2, sizeof(double));

    double *xb = calloc(npb, sizeof(double));
    double *yb = calloc(npb, sizeof(double));


    FILE *my_file_1 = fopen(ORG_FILE_NAME, "w"); // Output file (*.txt)

    if (my_file_1 == NULL)
    {
        perror(ORG_FILE_NAME);
        return(EXIT_FAILURE);
    }

    FILE *my_file_2 = fopen(BOUND_FILE_NAME, "w"); // Output file (*.txt)

    if (my_file_2 == NULL)
    {
        perror(BOUND_FILE_NAME);
        return(EXIT_FAILURE);
    }

    // Particles

    for (int i = 0; i < ny; i  )
    {
        for (int j = 0; j < nx; j  )
        {
            x[nx * i   j] = d_o / 2   j * d_o;
            y[nx * i   j] = d_o / 2   i * d_o;
            fprintf(my_file_1, "%7.4f %7.4fn", x[nx * i   j], y[nx * i   j]);
        }
    }

    // Boundries

    // Left wall

    for (int i = 0; i < nyw1; i  )
    {
        for (int j = 0; j < nrows; j  )
        {
            xw1[nrows * i   j] = -L / 2   d_o / 2   j * d_o;
            yw1[nrows * i   j] = d_o / 2   i * d_o;
            fprintf(my_file_2, "%7.4f %7.4fn", xw1[nrows * i   j], yw1[nrows * i   j]);

        }
    }

    // Right wall

    for (int i = 0; i < nyw2; i  )
    {
        for (int j = 0; j < nrows; j  )
        {
            xw2[nrows * i   j] = L / 2 - 4 * d_o   3 * d_o / 2   j * d_o;
            yw2[nrows * i   j] = d_o / 2   i * d_o;
            fprintf(my_file_2, "%7.4f %7.4fn", xw2[nrows * i   j], yw2[nrows * i   j]);
        }
    }

    // Bottom wall

    for (int i = 0; i < nrows; i  )
    {
        for (int j = 0; j < nxb; j  )
        {
            xb[nxb * i   j] = -L / 2   d_o / 2   j * d_o;
            yb[nxb * i   j] = -4 * d_o / 2   i * d_o;
            fprintf(my_file_2, "%7.4f %7.4fn", xb[nxb * i   j], yb[nxb * i   j]);

        }
    }

    if (fclose(my_file_1) != 0)
    {
        perror(ORG_FILE_NAME);
        return(EXIT_FAILURE);
    }

    if (fclose(my_file_2) != 0)
    {
        perror(BOUND_FILE_NAME);
        return(EXIT_FAILURE);
    }

    return EXIT_SUCCESS;
}
  

Комментарии:

1. ДА. Наконец, я вижу пример, в котором кто-то проверяет возвращаемое значение fclose() .

2. Спасибо за помощь