将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中的每一个都来自不同的函数。
答案 0 :(得分:1)
对于某些i
,InputDataId[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,代码的可读性会更好,并且您可以轻松地定义嵌套结构。