0

我在将 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 中的每一个都来自不同的函数。

4

3 回答 3

1

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

因此,当您致电时:

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

数组索引PresentData越界,导致内存错误和崩溃。

于 2012-06-16T07:48:38.133 回答
0

由于您没有给出确切的错误,我将对问题进行常识猜测。b 的值是您的 Id 数组中的一个元素。鉴于这是 along int并且您的代码暗示它是某种 ID 代码(而不是另一个数组的索引),它的值很可能超出了另一个数组的索引范围,PresentData这可能会导致您越界访问尝试导致的内存错误。您在代码中将 b 视为一个索引,而它看起来可能不是。

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

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

于 2012-06-16T09:23:51.670 回答
-1

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

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

void functionDoSomething(VII & arr) {  }

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

于 2012-06-16T11:15:58.590 回答