2016-01-13 238 views
-1

我相信我有一个声明不正确。我有一个2D数组和3D数组。我是seg错误,因为我将值0或NULL分配给其中一个数组。我知道这是试图将地址NULL分配给无效的指针。赋值给指针2d指针

也许我需要在分配前取消引用数组?如果是这样,我该怎么做?如果不是,我该如何声明数组?

double **WeightIH = calloc(51*20,sizeof(double **)); 
double ***Input = calloc(51*40, sizeof(double ***)); 
DeltaWeightIH[i][j] = 0.0 ; 
+1

在第一种情况下,使用'sizeof(* WeightIH)'代替或者总是比指针少一个星号'sizeof(double *)'。在这个特殊的设置中,它并不重要,但是如果你有一个类似'double * x;''malloc()'sizeof(double *)'的指针将会是错误的。此外,澄清你的问题,具体。并且不要使用'***'三星指针。你需要什么“* 3D阵列*”? –

+0

您似乎没有声明DeltaWeightIH - 尝试double *** WeightIH = calloc(51 * 20,sizeof(double **)),因为**是作为指针的指针,而***是指向指针的指针指向一个指针,****是一个指向指向指针的指针的指针。 – Nunchy

+0

@iharob我尝试过'sizeof(* WeightIH)',它仍然是seg故障。我需要一个神经网络的3D阵列 –

回答

0

一个简单的方法来定义5x6x7矩阵希望它有帮助。

float ***array3D; 
array3D = malloc(5 * sizeof(float**)); 
for (int i = 0; i < 5; ++i) { 
    array3D[i] = malloc(6 * sizeof(float*)); 
    for (int j = 0; j < 6; ++j) { 
     array3D[i][j] = calloc(7, sizeof(float)); 
     for (int k = 0; k < 7; ++k) 
      array3D[i][j][k] = 1.0; 
    } 
} 

定义指针数组时,我不会使用calloc,因为您立即在相同的循环中填充它们。 不要忘记自由,它会很快记住你的记忆。

0

最简单的方法是使用for循环。就像下面的例子一样

int i, j = 0; 
int rows = 5; 
int cols = 2; 

int rows2 = 3; // for 3d array 

double **arr2d = (double **)calloc(rows, sizeof(double)); 
double ***arr3d = (double ***)calloc(rows, sizeof(double)); 
for (i = 0; i < rows; j++) 
{ 
    arr2d[i] = (double *)calloc(cols, sizeof(double)); 
} 

arr2d[1][2] = 0.0; //Or *(*(arr2d+1)+2) = 0.0; 

//the same thing for 3d it just need another for loop. 
for (i = 0; i < rows; j++) 
{ 
    arr3d[i] = (double **)calloc(cols, sizeof(double)); 
    for (j = 0; i < cols; j++) 
    { 
     arr3d[i][j] = (double *)calloc(rows2, sizeof(double)); 
    } 
} 

arr3d[1][2][1] = 0.0; //Or *(*(*(arr2d+1)+2)+1) = 0.0; 
0

从你的问题不清楚你的问题是否连续阵列能满足你的要求;但是,如果是的话那么你可以更简单地写:

double (*a)[20] = malloc(51 * sizeof *a); 

double (*b)[20][30] = malloc(10 * sizeof *b); 

最里面的尺寸那张右手侧,另一维度去左边。

如果你真的需要一个锯齿状的数组,你需要为每一行分别编写分配。