【问题标题】:c allocating space for a 2d array of pointers in a loopc 为循环中的二维指针数组分配空间
【发布时间】:2016-04-19 04:26:56
【问题描述】:

我有一个相当大的程序,需要我使用指向二维数组的指针。我很难为数组分配空间。

我已经尝试在声明时分配空间,但我遇到了一百万个路障。

我在这里找到了代码:Create a pointer to two-dimensional array

我有一个指向数组other_arrays的指针的二维数组

我有这个:

    static double other_arrays[51][1];
    double (*SumH)[51][1] = &other_arrays;
    double (*WeightIH)[51][1] = &other_arrays;
    double (*Hidden)[51][1] = &other_arrays;
    double (*SumO)[51][1] = &other_arrays;
    double (*WeightHO)[51][1] = &other_arrays;
    double (*Output)[51][1] = &other_arrays;
    double (*DeltaWeightIH)[51][1] = &other_arrays;
    double (*DeltaWeightHO)[51][1] = &other_arrays;
    for (i = 0; i < 2; i++){
      for (j = 0; j < 51; j++){
        SumH[j][i] = (double *)malloc(sizeof(double));
        WeightIH[j][i] = (double *)malloc(sizeof(double));
        Hidden[j][i] = (double *)malloc(sizeof(double));
        SumO[j][i] = (double *)malloc(sizeof(double));
        WeightHO[j][i] = (double *)malloc(sizeof(double));
        Output[j][i] = (double *)malloc(sizeof(double));
        DeltaWeightIH[j][i] = (double *)malloc(sizeof(double));
        DeltaWeightHO[j][i] = (double *)malloc(sizeof(double));
      }
    }

当我编译时,我得到:error: array type 'double [1]' is not assignable

我尝试了一些我在网上找到的东西,例如SumH[j] = (double *)malloc(sizeof(double));

然后我得到:error: array type 'double [51][1]' is not assignable

或者类似的东西会产生同样的错误:

  for (j = 0; j < 51; j++){
    SumH[j] = (double *)malloc(sizeof(double));
    WeightIH[j] = (double *)malloc(sizeof(double));
    Hidden[j] = (double *)malloc(sizeof(double));
    SumO[j] = (double *)malloc(sizeof(double));
    WeightHO[j] = (double *)malloc(sizeof(double));
    Output[j] = (double *)malloc(sizeof(double));
    DeltaWeightIH[j] = (double *)malloc(sizeof(double));
    DeltaWeightHO[j] = (double *)malloc(sizeof(double));
  }

解决方案

我没有投malloc

    *SumH[j][i] = *(double *)malloc(sizeof(double));

【问题讨论】:

  • 不要将malloc() 转换为目标类型。
  • @iharob 我在 3D 分配时遇到总线错误*Input[i][j][k] = *(double *)malloc(sizeof(double)); i = 20 j = 2 k = 51
  • @iharob 这可能是 SO 中 c 标记问题被引用次数最多的句子。然而,常识是,这是一个风格问题。坚持强制转换 malloc() 的返回值是一件坏事[tm] 在我看来有点太教条了。
  • 你是想得到一个指针数组还是指向数组的指针?
  • 你的外循环范围是 0-1,但你的第二维是 1 而不是 2。为什么是 1,顺便说一句?

标签: c arrays pointers malloc allocation


【解决方案1】:

如果要分配二维数组:

    /* allocate 2d arrays */
    double (*SumH)[51][1] = malloc(51*1*sizeof(double));
    double (*WeightIH)[51][1] = malloc(51*1*sizeof(double));
    double (*Hidden)[51][1] = malloc(51*1*sizeof(double));
    double (*SumO)[51][1] = malloc(51*1*sizeof(double));
    double (*WeightHO)[51][1] = malloc(51*1*sizeof(double));
    double (*Output)[51][1] = malloc(51*1*sizeof(double));
    double (*DeltaWeightIH)[51][1] = malloc(51*1*sizeof(double));
    double (*DeltaWeightHO)[51][1] = malloc(51*1*sizeof(double));
    /* ... */
    free(DeltaWeightHO);
    free(DeltaWeightIH);
    free(Output);
    free(WeightHO);
    free(SumO);
    free(Hidden);
    free(WeightIH);
    free(SumH);

用法为 ... (*SumH)[j][i] ...

我怀疑这是你想要的。 分配指向二维数组第一行的指针:

    /* allocate pointers to first row of 2d arrays */
    double (*SumH)[1] = malloc(51*1*sizeof(double));
    double (*WeightIH)[1] = malloc(51*1*sizeof(double));
    double (*Hidden)[1] = malloc(51*1*sizeof(double));
    double (*SumO)[1] = malloc(51*1*sizeof(double));
    double (*WeightHO)[1] = malloc(51*1*sizeof(double));
    double (*Output)[1] = malloc(51*1*sizeof(double));
    double (*DeltaWeightIH)[1] = malloc(51*1*sizeof(double));
    double (*DeltaWeightHO)[1] = malloc(51*1*sizeof(double));

用法为 ... SumH[j][i] ...

分配指向行的指针数组

    /* allocate array of pointers to rows */
    double (*SumH[51])[1];
    for(i = 0; i < sizeof(SumH)/sizeof(SumH[0]); i++)
        SumH[i] = malloc(1*sizeof(double));

用法为 ... SumH[j][i] ...

【讨论】:

    【解决方案2】:

    如果你想要指向数组的指针并想要初始化它们,那么你应该做的事情要简单得多:

    double (*SumH)[5][2] = malloc(sizeof(*SumH));
    double (*WeightIH)[5][2] = malloc(sizeof(*WeightIH));
    

    现在你可以使用了:

    int k = 0;
    for (int i = 0; i < 5; i++)
    {
        for (int j = 0; j < 2; j++)
        {
            (*SumH)[i][j] = k;
            (*WeightIH)[i][j] = k++;
        }
    }
    

    请注意,[1] 的数组维度几乎没有意义。

    FWIW,valgrind 为以下代码提供了一份干净的健康清单:

    #include <stdio.h>
    #include <stdlib.h>
    
    int main(void)
    {
        double (*SumH)[5][2] = malloc(sizeof(*SumH));
        double (*WeightIH)[5][2] = malloc(sizeof(*WeightIH));
    
    
        int k = 0;
        for (int i = 0; i < 5; i++)
        {
        for (int j = 0; j < 2; j++)
        {
            (*SumH)[i][j] = k;
            (*WeightIH)[i][j] = k++;
        }
        }
    
        for (int i = 0; i < 5; i++)
        {
        for (int j = 0; j < 2; j++)
            printf("[%f, %f]", (*SumH)[i][j], (*WeightIH)[i][j]);
        putchar('\n');
        }
    
        free(SumH);
        free(WeightIH);
    
        return 0;
    }
    

    输出不是很精彩:

    [0.000000, 0.000000][1.000000, 1.000000]
    [2.000000, 2.000000][3.000000, 3.000000]
    [4.000000, 4.000000][5.000000, 5.000000]
    [6.000000, 6.000000][7.000000, 7.000000]
    [8.000000, 8.000000][9.000000, 9.000000]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-15
      • 1970-01-01
      • 2015-08-05
      • 2016-04-19
      • 2010-12-18
      • 2017-04-26
      相关资源
      最近更新 更多