c - 为什么分段错误和程序以退出代码 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;
}
解决方案
您正在尝试访问尚未分配给您的内存。
在第 17 行:分配给 m 的空间是C*sizeof(double*)
double ** m = (double **)malloc(C*sizeof(double*));
但稍后您尝试访问的第 46 行:
m[C][B] = 0;
这是一个问题,因为您只能访问直到m[C-1]
推荐阅读
- javascript - 如何用 2 个问题为 await 消息收集器打点
- pandas - pandas_dedupe 自动停止打印的设置
- javascript - 隐藏 ”
- " 元素,如果没有与数据过滤器相关的数据类别
- angular - 每秒添加材质进度条的值Angular10
- python - 如何使用python检查Windows是否提示通知框?
- oracle11g - JOOQ DSL 在 LISTAGG() 中解决 ORA-01489 的方法
- python - 尝试绘制图表
- api - 获取 geo/reverse_geocode Twitter API 不起作用
- json - 如何从自定义枚举中删除枚举变体标签?
- python - 如何在熊猫中返回具有多个条件的数据框