【问题标题】:Accessing a 2D array defined in a typedef struct in the main function. Code is in C访问在 main 函数的 typedef 结构中定义的二维数组。代码在 C 中
【发布时间】:2016-07-05 19:38:26
【问题描述】:
typedef struct DT {
   int ID;                  /* Class ID of this training pattern */
   int VecDim;              /* Vector dimension in Mat */
   int VecNum;              /* Number of vectors in Mat */
   float **Mat;             /* Vector sequence */
   struct DT *Next;
} DType;

二维数组在typedef struct 中定义。我想在主函数中访问它,尺寸为 [10000][64]。我需要 8 个这样的矩阵,其中每个矩阵从数据数组中读取 64 个字节的数据。操作是这样的,数据数组的前 64 个字节填充到第一个矩阵的第一行,接下来的 64 个字节填充到第二个矩阵的第一行,依此类推。当所有 8 个矩阵的第一行都填满时,它将开始填充每个矩阵的第二行。 这里Mat 是一个二维数组,我必须在主函数中访问它。我需要为每个创建的矩阵分配单独的内存吗?

【问题讨论】:

  • 在您的问题中包含您在main() 函数中尝试过的内容会有所帮助
  • 我在您的结构定义中看不到任何二维数组(可能看起来更像float Mat[N][M])。我所看到的只是一个指向浮点指针(float **)的指针,根据某些定义,它可能会或可能不会“像”二维数组一样使用,但一个简单的float * 也可以“像”二维数组一样使用.代码(不仅仅是结构定义)是确定这类事情的地方......
  • 如果你有 3 个维度(#of 数组、行和列),为什么需要两级间接?在需要时使用void * 并将其转换为指向二维数组的适当指针(例如float (*)[8][64/sizeof(float)])或float *** 会更有意义
  • 欢迎来到 Stack Overflow。请尽快阅读About 页面,以及有关创建 MCVE 的页面 (minimal reproducible example)。我们通常不会从头开始编写代码,但我们会帮助您解决代码中的问题。您对需要做什么的解释不清楚-每个矩阵中有 10,000 行,每行有 64 个浮点数。你如何从 64 字节的数据中填充这些浮点数?如何从 64 个字节中填充 10,000 行?
  • 感谢您的建议,我将首先开始编写自己的代码,稍后会提出问题。就问题而言,我有一个一定大小的浮点数组,我需要将该数组的前 64 个元素放在第一个矩阵中,接下来的 64 个元素放在另一个矩阵中,依此类推。

标签: c arrays matrix typedef


【解决方案1】:

我需要为每个创建的矩阵分配单独的内存吗?

是的,如果你不给Mat 赋值,它会被认为是一个“悬空指针”,并且试图访问它会导致未定义的行为。您还必须为每个矩阵分配自己的内存块,否则它们都将指向同一个矩阵。看下面的例子(假设dt是一个链表):

DType *dt = ...;
while(dt)
{
    dt->Mat = malloc(10000 * 64 * sizeof(float));
    dt = dt->Next;
}

【讨论】:

    猜你喜欢
    • 2013-07-20
    • 1970-01-01
    • 2014-12-14
    • 2021-01-28
    • 2017-04-13
    • 2021-09-22
    • 1970-01-01
    • 2016-12-03
    • 1970-01-01
    相关资源
    最近更新 更多