std :: array to pointer access violation error

时间:2013-06-09 17:41:22

标签: c++ c++11

我正在尝试使用Transpose函数而不是std::arrays。我想这样做的原因是因为我可以通过std::array函数向它传递指针或.data()

目前我有以下内容,它可以使用2D和1D数组进行位置转换或新数组。但是,将下面的代码转换为指针代替会产生内存访问冲突错误。

有人可以解释这些差异以及为什么以下不等于我的指针版本(在此下面):

#include <iostream>
#include <array>

template<typename T, std::size_t Size>
void Transpose(std::array<T, Size> &Data)
{
    int Width = sqrt(Size);
    for (int I = 1; I < Width; ++I)
    {
        for (int J = 0; J < I; ++J)
        {
            std::swap(Data[I * Width + J], Data[J * Width + I]);
        }
    }
}

template<typename T, std::size_t Size>
void Transpose(std::array<std::array<T, Size>, Size> &Data)
{
    for (int I = 0; I < Size; ++I)
    {
        for (int J = 0; J < I; ++J)
        {
            std::swap(Data[I][J], Data[J][I]);
        }
    }
}

但是,当我使用指针时,转换为以下内容不起作用:S

template<typename T>
void Transpose(T* Data, std::size_t Size)
{
    int Width = sqrt(Size);
    for (int I = 1; I < Width; ++I)
    {
        for (int J = 0; J < I; ++J)
        {
            std::swap(Data[I * Width + J], Data[J * Width + I]);
        }
    }
}

template<typename T>
void Transpose(T** Data, std::size_t Size)
{
    for (int I = 0; I < Size; ++I)
    {
        for (int J = 0; J < I; ++J)
        {
            std::swap(Data[I][J], Data[J][I]);
        }
    }
}

任何人都可以解释一下差异以及为什么T**不起作用吗?

1 个答案:

答案 0 :(得分:3)

二维数组不会衰减为双指针。它衰变为T*[]。有关说明,请参阅this thread

您必须将故障线路更改为:

void Transpose(T* Data[], std::size_t Size)

或(因此可以推断出长度)

template <typename T, std::size_t Size1, std::size_t Size2>
void Transpose(T (&Data)[Size1][Size2])