这段代码说的是: (代码尝试填充外观数组直到100) 我将向量数组的大小固定在arrayOne [0] .numberOfThings中,因为我知道这是它可以包含的最大项目数,您可以将其视为已知整数。
int max = 100;
int maxNThings = arrayOne[0].numberOfThings; //Integer that I know and I pickit as the max for dynamic array
vector<Thing>* appearanceArrayOfNumThings;
appearanceArrayOfNumThings= new vector<Thing>[maxNThings];
for (int i = 0; i<max;i++){
int currentNumberOfThings = arrayOne[i].numberOfThings;
appearanceArrayOfNumThings[currentNumberOfThings ].push_back(arrayOne[i]);
}
我有
访问冲突读取位置0xFFFFFFFFFFFFFFFFFF
在for语句中,行appearanceArrayOfNumThings[currentNumberOfThings ].push_back(arrayOne[i]);
我正在考虑是否是因为我不知道矢量行为。
您能给我任何线索还是看到我做错了什么吗?
答案 0 :(得分:2)
首先,您应该使用调试器,您会立即发现该错误。
第二,new vector<Thing>[maxNThings]
是一个不好的想法。 不要这样做 。至少使用std::vector<std::vector<Thing>>
。在我看来,包含向量的结构向量更加清晰。
使用向量vector,您可以使用.at()
来告知您的错误。
此代码将始终调用未定义的行为。
int maxNThings = arrayOne[0].numberOfThings;
让我们暂时说这个数字是12
。
appearanceArrayOfNumThings = new vector<Thing>[maxNThings]; // 12
这将创建12个向量的数组。可从0
到11
进行索引。
for (int i = 0; i < max ;i++){
// ...
}
对于第一次迭代,i
等于0
。让我们继续。
// i == 0
int currentNumberOfThings = arrayOne[i].numberOfThings;
在这一点上,arrayOne[i]
与arrayOne[0]
相同,因为i
等于0
。因此currentNumberOfThings
等于12
,等于maxNThings
。
appearanceArrayOfNumThings[currentNumberOfThings ]
此访问权限appearanceArrayOfNumThings[12]
已超出限制,因为appearanceArrayOfNumThings
可从0
到11
进行索引。您输入UB土地。这是您的错误。
对于任何值maxNThings
,它将始终失败。