gpt4 book ai didi

c - <错误: Cannot access memory at address 0x0> 3d array malloc

转载 作者:行者123 更新时间:2023-11-30 21:20:18 25 4
gpt4 key购买 nike

我有一个程序需要 3D 数组才能完成这项工作。

这是我声明数组的方式:

double ***Xab,**Rab, ***Vab;

这是我制作数组的方式:上下文: N = 4 ,坐标 = 3

Xab = malloc( N * sizeof(double));
Vab = malloc( N * sizeof(double));
Rab = malloc( N * sizeof(double));
for ( z = 0; z < N ; z++) {
Xab[z] = (double **)malloc( N * sizeof(double));
Vab[z] = (double **)malloc( N * sizeof(double));
Rab[z] = (double *)malloc(N * sizeof(double));
for ( v = 0; v < coordenadas; v++) {
Xab[z][v] = (double *)malloc( coordenadas * sizeof(double));
Vab[z][v] = (double *)malloc( coordenadas * sizeof(double));
}
}

这是我填充数组的方式:

for ( z = 0; z < N; z++) {
for ( v = 0; v < N; v++) {
for ( w = 0; w < coordenadas; w++) {
Xab[z][v][w] = y[z][w] - y[v][w];
Vab[z][v][w] = y[z][w+3] - y[v][w+3];
}
Rab[z][v] = sqrt( pow(Xab[z][v][0],2)+ pow(Xab[z][v][1],2)
+ pow(Xab[z][v][2],2) );
}
}

问题直接出在 XabVab (3D 数组)上,只要 N < 4 一切都可以正常工作,但是当N > 3 我遇到段错误。

我尝试在 OpenSuse Leap 42.1 ( x86_64 ) 上调试它 ( gdb )。

程序收到信号 SIGSEGV,段错误。PostNewtonNcuerposV2 中的 0x0000000000405009 (x=0, y=0x60a040, dvdt=0x60a4e0, M=0x60a010, N=4)在 NbodyPNV2.c:34

34 Xab[z][v][w] = y[z][w] - y[v][w];

<小时/>

1: y[z][w] = 0

2:y[v][w] = 59165672784.100632

3: w = 0

4:v = 3

5: z = 0

6: Xab[z][v][w] = "错误: 无法访问地址 0x0 处的内存"

所以我尝试了以下方法:

(gdb)显示Vab[3][3][3]

7: Vab[3][3][3] = 错误:无法访问地址 0x18 处的内存

(gdb)显示Vab[3][2][3]

9: Vab[3][2][3] = 6.4687520944348569e-319

<小时/>

所以,这就是问题所在。 2D 数组内存分配在 N > 3 以上工作正常,但 3D 数组的 2D 段则不然,并且适用于我拥有的所有 3D 数组。

我认为这可能是因为数组的制作方式。在调查时,我遇到一篇文章谈论操作系统本身的堆栈溢出(讽刺的是),但我找不到任何解决方案。我能找到的所有其他帖子都通过正确的控制变量使用(在我的例子中为 z,v,w )或更好的数组声明来解决它。在这种情况下,代码根本不起作用,但我的代码可以(如预期)使用 N < 3。

所以,主要问题如下。3d数组的分配有什么问题吗?或者有什么方法可以让程序访问或更改尝试使用的内存地址吗?

任何想法都值得赞赏。

提前谢谢您。

最佳答案

您没有为数组分配适当的内存量。

首先,第一个维度的分配应该是 sizeof(double **) 的倍数,因为这是您要为其创建数组的类型。同样,第二个维度的分配应该是 sizeof(double *) 的倍数。

其次,内循环的范围不正确。由于第二个维度有 N 个元素,因此您希望该循环运行 N 次,而不是 coordenadas 次。因此,当 N 大于 coordenadas 时,就没有足够的空间容纳第二维的元素。

此外,don't cast the return value of malloc ,因为这可能会导致微妙的错误。

通过上述修复,您现在应该拥有以下内容:

Xab = malloc( N * sizeof(double **));
Vab = malloc( N * sizeof(double **));
Rab = malloc( N * sizeof(double *));
for ( z = 0; z < N ; z++) {
Xab[z] = malloc( N * sizeof(double *));
Vab[z] = malloc( N * sizeof(double *));
Rab[z] = malloc(N * sizeof(double));
for ( v = 0; v < N; v++) {
Xab[z][v] = malloc( coordenadas * sizeof(double));
Vab[z][v] = malloc( coordenadas * sizeof(double));
}
}

关于c - <错误: Cannot access memory at address 0x0> 3d array malloc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40113886/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com