【问题标题】:C++ Troubles allocating matrix with only cols known and unknown rowsC++ 麻烦分配只有列已知和未知行的矩阵
【发布时间】:2013-07-30 10:09:34
【问题描述】:

我有一个疑问。

我有一个矩阵,我知道它将有 3 列,但行数将在存储矩阵的类的构造函数中定义。然后我将变量声明为

int * ColorsYUV[3];

但是当我尝试使用 malloc 分配它时:

ColorsYUV = (int *) malloc(sizeof(T) * 8 * sizeof(int) * 3);

我收到此错误:

incompatible types in assignment of ‘int*’ to ‘int* [3]’

我该如何解决这个问题。我意识到的唯一想法是使用一个简单的向量并访问它,添加一个从 0 到 2 的“for”循环,但是,如果可能的话,我更喜欢像矩阵这样的访问。

ColorsYUV[i][0]...
ColorsYUV[i][1]...
ColorsYUV[i][2]...

我希望我能解释一下我自己... 提前致谢。

【问题讨论】:

  • 是 C++ 还是 C?因为它们是相当不同的,所以请调整你的标签。
  • 我正在使用 C++,但我坚持认为指针规则在 C 和 C++ 中是相等的。我是新手,我在 C++ 中只有 2 周,请不要强硬。我认为我克服了其他答案的麻烦,但感谢您花时间阅读我的问题。
  • @Bardo91 指针在两种语言中几乎相同,但此类问题的 C++ 解决方案不使用指针; C解决方案可以。 (你写的基本上是C。永远不会用C++写。)
  • 哦,我不知道。我相信即使在 C++ 中,像 C 分配一样分配总是更好。再次感谢。我会检查我的整个代码

标签: c++ c vector matrix malloc


【解决方案1】:

首先,正如 ogni42 所说,你真的应该使用 std::vector<std::array<int, 3>>;如果你没有 C++11, 然后使用boost::array 而不是std::array。否则,如果 你真的在使用 C 而不是 C++:

int* ColorsYUV[3];

声明一个由三个指针组成的数组。你想要的是:

int (*ColorsYUV)[3];

这是一个指向三个数组的指针。

那么,我不明白你的 malloc:sizeof(T) 在哪里 进入它:如果你想分配一个 8 x 3 矩阵:

ColorsYUV = (int (*)[3])malloc( 8 * 3 * sizeof(int) );

请注意,您必须在 投掷; ColorsYUV 不是 int*,所以强制返回 mallocint* 的值不起作用。 (当然, 如果你使用 C,你可以做其他人做的事情,并且 完全放下演员表。 C允许隐式转换 void* 指向任何对象指针类型。)

【讨论】:

  • +1 用于区分指针数组和指向三个数组的指针!
  • 哦,对不起,我在课堂上使用了模板。 T 可以是 int、float 或 double。感谢您的回答,也感谢 ogni42。我很高兴。现在我认为我对指针的理解更好
【解决方案2】:

首先:如果是 C++,请考虑使用std::vector<array<int, 3>>。您将免费获得数组访问[][] 以及内存管理。

如果您想在保持 C 风格的同时解决问题,则需要将强制转换为正确的类型

【讨论】:

  • 如果他坚持使用 C,他也必须修复 ColorsYUV 的声明。目前,它是一个数组(这意味着您不能分配给它,也不能将指针转换为它)。但当然,这是一种说明为什么应该切换到 C++ 的事情。
【解决方案3】:

先声明指针数组(列)

 int (*ColorsYUV)[3];

然后使用'for'循环分配内存。它被用作一个指针一次可以指向一个内存地址,而不是整个数组。假设行数 = 8,所以

  int no_of_rows = 8; //value set as an example
  for (i=0;i<3;i++)
  {
     ColorsYUV[i] = (int *) malloc(sizeof(int) * no_of_rows);
  }

希望您现在不会出错。

【讨论】:

    猜你喜欢
    • 2018-04-24
    • 1970-01-01
    • 1970-01-01
    • 2021-08-17
    • 1970-01-01
    • 2017-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多