【问题标题】:How to pass MyClass[][] for MyClass**?如何为 MyClass** 传递 MyClass[][]?
【发布时间】:2026-01-13 15:20:08
【问题描述】:

为什么我不能通过

    Point src[1][4] = {
        {
            Point(border,border), Point(border,h-border), Point(w-border,h-border), Point(w-border,h-border)
        }
    };

作为

polylines(frame, src, ns, 1, true, CV_RGB(255,255,255), 2); 

在哪里

折线有原型

void polylines(Mat& img, const Point** pts, const int* npts, int ncontours, bool isClosed, const Scalar& color, int thickness=1, int lineType=8, int shift=0 )

更新

好的,好的,我记住了这些东西:)

【问题讨论】:

  • 您收到的错误是什么?

标签: c++ pointers multidimensional-array casting


【解决方案1】:

因为它们不是一回事。 polylines 要求一个指向 pointersPoint 的指针,但你给它一个指向 Point 的数组 [4] 的指针。

改写:当您将src 用作这样的表达式时,它会从数组衰减为指针。在这种情况下,它将从Point[1][4] 衰减到Point(*)[4],即指向Point 类型的大小为4 的数组的指针。这是 4 个Point 对象的内存位置。 polylines 期望 指针 的内存位置指向 Point 对象。

【讨论】:

    【解决方案2】:

    Point[1][4] 无法通过这种方式转换为Point**
    看看这个问题:Converting multidimensional arrays to pointers in c++

    这里的实际解决方案是使用 STL 容器而不是 C 样式数组,例如std::vector:

    typedef std::vector<Point> Shape;
    std::vector<Shape> myShapes;
    ...
    

    并通过const 引用而不是const 指针传递它:

    void polylines(Mat& img, const std::vector<Shape>& shapes, ...)
    

    还请注意,srcnspts 等对于您的变量来说并不是很幸运的名称。尝试选择更有意义的名称......如果不是为了你自己,那么为了该代码的未来读者而这样做:)

    【讨论】:

      【解决方案3】:

      Array-of-arrays 和pointer-to-pointers 并不意味着相同的内存布局。数组数组包含其所有连续元素,而指向指针的指针需要一个连续指针数组,这些指针指向(可能是非连续的)连续元素数组。

      要进行这种转换,您需要分配一个指针数组并让它们指向您的数组数组中的正确条目。在您的情况下,由于您只有一组值,因此更简单:

      Point * pointer = &src[0][0];
      int npts = 4;
      polylines(img, &pointer, &npts, 1, ...);
      

      假设ncontours 是指针指向的指针的数量,npts 是各个指针指向的点的数量。

      【讨论】:

        【解决方案4】:

        请检查这个问题:casting char[][] to char** causes segfault?

        简答:你不应该这样做

        【讨论】: