我有一个程序需要3D数组才能完成这项工作。
这就是我宣布数组的方式:
double ***Xab,**Rab, ***Vab;
这就是我制作数组的方式: 上下文:N = 4,coordenadas = 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) );
}
}
问题直接出现在Xab
和Vab
(3D数组)上,只要 N&lt; 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] =&#34;错误:无法访问地址0x0和#34的内存;
所以我尝试了以下内容:
(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> 1之上正常工作。 3但是3D阵列的2D部分并不适用,而且适用于我拥有的所有3D阵列。
我认为这可能是因为制作数组的方式。在调查时,我遇到一篇文章,谈论堆栈溢出(具有讽刺意味的是)操作系统本身,但我无法找到任何解决方案。我能找到的所有其他帖子都使用正确的控制变量用法(在我的情况下为z,v,w)或更好的数组声明来解决它。在这种情况下,代码根本不起作用,但是我的(如预期的那样)N&lt; 3.
所以,主要问题如下。 3D阵列的分配有什么问题吗?要么 有没有办法让程序访问或更改试图使用的内存地址?
任何想法都表示赞赏。
提前谢谢你。
答案 0 :(得分:2)
您没有为阵列分配适当的内存量。
首先,第一个维度的分配应该是PUT /_template/template_1
{
"template": "te*",
"settings": {
"number_of_shards": 1
},
"mappings": {
"type1": {
"_source": {
"enabled": false
},
"_all": {
"enabled": false
},
"properties": {
"host_name": {
"type": "string",
"index": "not_analyzed"
},
"created_at": {
"type": "date",
"format": "EEE MMM dd HH:mm:ss Z YYYY"
}
}
}
}
}
的倍数,因为这是您为其创建数组的类型。同样,第二维的分配应该是sizeof(double **)
的倍数。
其次,内环的范围不正确。由于第二维有sizeof(double *)
个元素,因此您希望该循环运行N
次,而不是N
次。因此,当coordenadas
大于N
时,您没有足够的空间容纳第二维的元素。
此外,don't cast the return value of malloc
,因为这会导致微妙的错误。
通过上述修复,您现在应该拥有:
coordenadas