繁体   English   中英

为指向指针二维数组的指针赋值

[英]Assign value to pointer to pointer 2d array

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

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

double **WeightIH = calloc(51*20,sizeof(double **));
double ***Input = calloc(51*40, sizeof(double ***));
DeltaWeightIH[i][j] = 0.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,因为您在同一个循环中立即填充它们。 不要忘记释放,它会很快吃掉你的内存。

最简单的方法是使用 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;

从您的问题中不清楚连续数组是否满足您的要求; 但如果是这样,那么你可以写得更简单:

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

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

最里面的维度在右侧,其他维度在左侧。

如果您确实需要一个锯齿状数组,则需要为每一行编写单独的分配。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM