【问题标题】:How to use 2D arrays inside a C struct?如何在 C 结构中使用二维数组?
【发布时间】:2018-02-22 21:10:57
【问题描述】:

我需要创建一个包含 2D 数组的结构,但是数组大小可以变化,所以我不能用恒定长度定义它。我试图用双指针解决这个问题,只是发现双指针与双数组不同。那我该怎么做呢?

struct GaussianKernel {
   int r;
   double weightSum;
   double **kernel;
};

GaussianKernel initializeKernel2D(jdouble sigma){
   int r = (int) ceil(3 * sigma);
   int kernelLen = 2 * r + 1;
   double G[kernelLen][kernelLen];
   double weightSum = 0;
   double temp;

   for (int y = -r; y <= r; y++)
   {
      for (int x = -r; x <= r; x++)
      {
         temp =  exp(-(pow(x, 2) + pow(y, 2)) / (2 * pow(sigma, 2))) / (2 * PI * pow(sigma, 2));
         G[y + r][x + r] = temp;
         weightSum = weightSum + temp;
      }
   }

   struct GaussianKernel GKernel;
   GKernel.r = r;
   GKernel.kernel = G;
   GKernel.weightSum = weightSum;

   return GKernel;
}

【问题讨论】:

  • 请注意,您的代码试图返回一个指向局部变量的指针——这是非常错误的。您将需要使用动态分配。您对该结构的使用位置有多少控制权?你将传递给你没有编写的函数什么?一种选择是简单地分配一个大小合适的double 值向量,然后使用表达式gk-&gt;kernel[row * (2 * gk-&gt;r + 1) + col](而不是gk-&gt;kernel[row][col])对其进行索引,但最好在结构中明确记录数组大小。这或多或少是微不足道的。替代品(如果有的话)很混乱。

标签: c multidimensional-array struct


【解决方案1】:

你应该将你的二维动态数组分配为:

GKernel.kernel = malloc(kernelLen * sizeof(double *));
for(i=0;i<kernelLen;i++)
GKernel.kernel[i] = malloc(kernelLen * sizeof(double));

然后您可以根据程序的逻辑将值存储在 GKernel.kernel

【讨论】:

  • 引用这个问题:我试图用双指针解决这个问题,结果发现双指针与双数组不同。这个答案看起来非常像使用双指针。
  • 没错,我同意双数组和指针数组是不同的
猜你喜欢
  • 2011-03-17
  • 2021-09-22
  • 1970-01-01
  • 2012-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-13
相关资源
最近更新 更多