<error:can not =“”access =“”memory =“”at =“”address =“”0x0 =“”> 3d array malloc

时间:2016-10-18 16:50:02

标签: c arrays multidimensional-array segmentation-fault malloc

我有一个程序需要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) );
  }
}

问题直接出现在XabVab(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阵列的分配有什么问题吗?要么 有没有办法让程序访问或更改试图使用的内存地址?

任何想法都表示赞赏。

提前谢谢你。

1 个答案:

答案 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