返回指向多维数组的指针

Returning a Pointer to a Multidimensional Array

本文关键字:数组 指针 返回      更新时间:2023-10-16

我想使用以下函数返回一个转置的指向多维数组的指针。

代码

float** Matrix3f::Transpose( void )
{
    float matrix[MATRIX3_DIMS][MATRIX3_DIMS] =
    {
        { mMatrix[ 0 ][ 0 ], mMatrix[ 1 ][ 0 ], mMatrix[ 2 ][ 0 ] },
        { mMatrix[ 0 ][ 1 ], mMatrix[ 1 ][ 1 ], mMatrix[ 2 ][ 1 ] },
        { mMatrix[ 0 ][ 2 ], mMatrix[ 1 ][ 2 ], mMatrix[ 2 ][ 2 ] }
    };
    float** ret = new float*[ MATRIX3_DIMS ];
    for ( int i = 0; i < MATRIX3_DIMS; i++ )
    {
        for ( int j = 0; j < MATRIX3_DIMS; j++ )
        {
            ( *ret )[ i ][ j ] = matrix[ i ][ j ];
        }
    }
    return ret;
}

描述

如图所示,我使用初始化语法声明了一个多维数组(使用类成员matrix-mMatrix-来创建矩阵本身的转置版本。然后,我将一个多维指针分配给一个数组(ret)并循环通过,将本地数组的每个成员matrix分配给ret指针数组。

我收到的错误如下:

error: invalid types ‘float[int]’ for array subscript

问题

我到底做错了什么?我该如何完成这项任务?

ret是指向浮点指针的指针。当你取消引用它时,就像这样:(*ret),你会得到一个浮动的指针。当你对它取一个索引时,比如( *ret )[ i ],它会给你一个浮点值。当你对它取一个索引时,就像这样:( *ret )[ i ][ j ],好吧,你试图从一个float中取索引。这是不合法的。

抛开我对这种编码风格的厌恶不谈,你做错的第一件事就是没有分配子数组。不过,编译器错误指的是我在第一段中说明的错误。只需删除ret的取消引用即可解决此问题。你最终得到的是:

for ( int i = 0; i < MATRIX3_DIMS; i++ )
{
    ret[i] = new float[MATRIX3_DIMS];
    for ( int j = 0; j < MATRIX3_DIMS; j++ )
    {
        ret[ i ][ j ] = matrix[ i ][ j ];
    }
}

不过,这完全不是异常安全的,您应该使用一个以异常安全的方式正确管理内存的类,如std::vector