Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
<;错误:无法访问地址0x0处的内存>;三维阵列malloc_C_Arrays_Multidimensional Array_Segmentation Fault_Malloc - Fatal编程技术网

<;错误:无法访问地址0x0处的内存>;三维阵列malloc

<;错误:无法访问地址0x0处的内存>;三维阵列malloc,c,arrays,multidimensional-array,segmentation-fault,malloc,C,Arrays,Multidimensional Array,Segmentation Fault,Malloc,我有一个程序,需要3D阵列才能完成这项工作 这就是我声明数组的方式: 这就是我制作阵列的方式: 上下文:N=4,坐标=3 Xab=malloc(N*sizeof(double)); Vab=malloc(N*sizeof(双)); Rab=malloc(N*sizeof(双)); 对于(z=0;z

我有一个程序,需要3D阵列才能完成这项工作

这就是我声明数组的方式:

这就是我制作阵列的方式: 上下文:N=4,坐标=3

Xab=malloc(N*sizeof(double));
Vab=malloc(N*sizeof(双));
Rab=malloc(N*sizeof(双));
对于(z=0;z
这是我填充数组的方式:

(z=0;z{ 对于(v=0;v 问题直接出现在
Xab
Vab
(3D阵列)上,只要N<4,一切都正常,但当N>3时,我就会出现分段错误

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

程序接收信号SIGSEGV,分段故障。 PostNewtonNcuerposV2中的0x00000000000405009(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]

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

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

9:Vab[3][2][3]=6.468752094448569E-319


这就是问题所在。2D数组内存分配在N>3以上运行良好,但3D数组的2D段没有,并且适用于我拥有的所有3D数组

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

因此,主要问题如下。 3d阵列的分配有什么问题吗?或 有没有办法让程序访问或更改试图使用的内存地址

任何想法都值得赞赏


先谢谢你

您没有为阵列分配适当的内存量

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

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

此外,因为这可能会导致微妙的错误

通过上述修复,您现在应该有以下功能:

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));
  }
}
Xab=malloc(N*sizeof(double**));
Vab=malloc(N*sizeof(双**));
Rab=malloc(N*sizeof(double*);
对于(z=0;z <代码> SigeOf(双)如果您的代码至少与代码< > SeZeof(双**)或<代码> SIZEF(双*)一样,则认为自己是幸运的。您的外部尺寸使用了错误的类型。而且,你的代码中没有3D数组,也没有可以表示3D数组的东西。3D数组类似于
double[DIMZ][DIMY][DIMX]
。您的锯齿状数组不能表示3D数组,也不能指向3D数组。无论出于何种原因,请使用tripple间接寻址。。。求你了,别那么做。请记住,
intfoo[3][3][3]
intfoo[27]
基本上可以以完全相同的方式使用。数组始终是一个连续的内存块,1D或3D,它实际上没有多大区别。您需要1块足够容纳
double的内存,为什么不使用
double*Xab=malloc(N*N*N*sizeof*Xab)?除了为
sizeof
使用错误的类型外,还为制作阵列的内部循环使用了错误的终止值。我认为应该是(v=0;v
,而不是(v=0;v
。作为一名三星级C程序员不是一种恭维。在大多数情况下,这是一个错误观念的信号。包括您的。也许最好在任何地方使用
malloc(N*sizeof*)
。无需计算出要使用的
sizeof
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 = 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));
  }
}