首页 > 解决方案 > 为什么分段错误和程序以退出代码 139 结束?

问题描述

我尝试用 c 语言追溯计算有关可能性的函数,并将结果写入文本。使用代码块 17.12 运行我的程序的结果是:

"Linking stage skipped (build target has no object files to link" and
"Nothing to be done (all items are up-to-date)"

另外,我尝试使用在线编译器(https://www.onlinegdb.com/online_c_compiler)运行此代码,结果是:“分段错误”和“程序以退出代码 139 完成”

我相信我的问题是关于 3D 和 2D 多维数组的内存分配。

请帮我!!

代码是:

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

int main()
{
    double z[7] = { 0, 19.08, 16.86, 11.72, 14.49, 10.87, 11.63 };
    int N, k, i, j, l, fptr;
    int A = 6, B = 544, C = 7;

    double *** p = (double ***) malloc(A * sizeof(double**));
    double *** X = (double ***) malloc(A * sizeof(double**));
    double *** R = (double ***) malloc(A * sizeof(double**));
    double ** sum = (double **) malloc(A * sizeof(double*));
    double ** sum2 = (double **) malloc(A * sizeof(double*));
    double ** m = (double **) malloc(C * sizeof(double*));

    for (i = 0; i < A; i++)
    {
        p[i] = (double **) malloc(B * sizeof(double *));
        X[i] = (double **) malloc(B * sizeof(double *));
        R[i] = (double **) malloc(B * sizeof(double *));

        for (j = 0; j < B; j++)
        {
            p[i][j] = (double *) malloc(B * sizeof(double));
            X[i][j] = (double *) malloc(B * sizeof(double));
            R[i][j] = (double *) malloc(B * sizeof(double));
            sum[i] = (double *) malloc(B * sizeof(double));
            sum2[i] = (double *) malloc(B * sizeof(double));
        }
    }

    for (i = 0; i < C; i++)
    {
        m[i] = (double *) malloc(B * sizeof(double));
    }
    for (i = 1; i < 7; ++i)
    {
        for (N = 1; N < 545; ++N)
        {
            for (k = 0; k < N + 1; ++k)
            {
                m[C][B] = 0;
                p[A][B][B] = 0;
                X[A][B][B] = 0;
                R[A][B][B] = 0;
                sum2[A][B] = 0;
                sum[A][B] = 0;
            }
        }
    }
    for (i = 1; i < 7; ++i)
    {
        p[i][0][0] = 1;
        for (N = 1; N < 545; ++N)
        {
            for (k = 0; k < N + 1; ++k)
            {
                if (k == 0)
                {
                    for (l = 1; l < N + 1; ++l)
                    {
                        p[i][l][N] = pow(0.5 * N / 544, l);
                        sum[i][N] += p[i][l][N];
                    }
                    p[i][k][N] = 1 - sum[i][N];
                }
                if (k != 0)
                {
                    p[i][k - 1][N - 1] = pow(0.5 * (N) / 544, k - 1);
                    m[i][k] = k * z[i];
                    X[i][k][N] = p[i][k][N] * m[i][k] / p[i][k - 1][N - 1];
                    // m[i][k] = X[i][N] * p[i][k-1][N-1] / p[i][k][N];
                    printf("X = %.2lf", X[i][k][N]);
                    sum2[i][N] += k * p[i][k - 1][N - 1] / m[i][k];
                }
                if (k == N)
                {
                    R[i][k][N] = m[i][k] * sum2[i][N];
                    printf("R = %.2lf", R[i][k][N]);
                }
            }
        }
    }
    for (i = 1; i < 7; ++i)
    {
        for (N = 1; N < 545; ++N)
        {
            for (k = 0; k < N + 1; ++k)
            {
                FILE *fptr;
                fptr = fopen("C:\\program.txt", "w");

                if (fptr == NULL)
                {
                    printf("Error!");
                    exit(1);
                }
                fprintf(fptr, "%.21f", X[i][k][N]);
                fprintf(fptr, "%.21f", R[i][k][N]);

                fclose(fptr);
            }
        }
    }
    return 0;
}

标签: cmultidimensional-arraysegmentation-fault

解决方案


您正在尝试访问尚未分配给您的内存。

在第 17 行:分配给 m 的空间是C*sizeof(double*)

double ** m = (double **)malloc(C*sizeof(double*));

但稍后您尝试访问的第 46 行:

m[C][B] = 0;

这是一个问题,因为您只能访问直到m[C-1]


推荐阅读