在c ++中将2d动态数组传递给我的类的函数

时间:2012-06-16 07:38:16

标签: c++ arrays dynamic

将2d动态数组传递给我的类的函数时遇到问题。

void s::LoadData(long int &Num_Of_InputDataId,
                 long int **PresentData,
                 long int **InputDataId,
                 long int **InputData)
{
    long int b;

    for (long int i=0;i<Num_Of_InputDataId;i++)
    {
        b = InputDataId[i][0];
        for(long int j=0;j<Num_Of_InputDataId;j++)
        {  
           InputData[i][j]=PresentData[b][j]; //error occur here
        } // end of internal for
    } //end of external for
}

主:

long int Num_Of_InputDataId=10;

long int **PresentData;
PresentData = new long int *[Num_Of_InputDataId];

for (long int ii = 0; ii < Num_Of_InputDataId; ++ii)
    PresentData[ii] = new long int[Num_Of_InputDataId];

long int ** InputDataId;
InputDataId = new long int *[Num_Of_InputDataId];

for (long int ii = 0; ii < Num_Of_InputDataId; ++ii)
    InputDataId[ii] = new long int[2];


long int ** InputData;
InputData = new long int *[Num_Of_InputDataId];

for (long int ii = 0; ii < Num_Of_InputDataId; ++ii)
    InputData[ii] = new long int[Num_Of_InputDataId];

Load.LoadData(Num_Of_InputDataId, PresentData, InputDataId, InputData);

Num_Of_InputDataId,PresentData和InputDataId中的每一个都来自不同的函数。

3 个答案:

答案 0 :(得分:1)

对于某些iInputDataId[i][0]大于或等于Num_of_InputDataId

因此,当您致电:

b = InputDataId[i][0];
... = PresentData[b][...];

PresentData的数组索引超出范围,导致内存错误并崩溃。

答案 1 :(得分:0)

由于你没有给出确切的错误,我会对问题做出常识猜测。 b的值是Id数组中的元素。鉴于这是一个long int并且你的代码暗示它是某种ID代码(而不是另一个数组的索引),它的值很可能超过你的另一个数组的索引范围{{ 1}}这可能会导致您从越界访问尝试中出现内存错误。您正在将代码中的b视为一个索引,就好像它不是它一样。

最简单的检查方法是使用调试器逐步执行代码(这应该是您首次尝试识别问题的实际情况),而不是从程序错误报告中猜测。事实上,使用调试器可能比在此处粘贴代码花费更少的时间并提出问题,因此如果您没有使用调试工具,那么您真的应该这样做,因为它将帮助您无止境。

正如超人的评论所暗示的,鉴于您使用C ++,可以利用STL可以为您做的所有好事并使用向量。

答案 2 :(得分:-1)

正如@Superman对您的问题发表评论一样,这里有一个简单的片段,可以让生活变得轻松。

#define V(x) std::vector< x>  
typedef V(int)  VI;  
typedef V(VI)  VII; 

void functionDoSomething(VII & arr) {  }

(通过引用传递矢量)。通过在代码中使用这样的typedef,代码的可读性会更好,并且您可以轻松地定义嵌套结构。