动态向量数组中的 C++ 访问冲突读取位置 0xFFFFFFFFFFFFFFFF
C++ Access violation reading location 0xFFFFFFFFFFFFFFFF in dynamic array of vectors
这段代码是这样说的:
(代码试图填充外观数组直到 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]);
}
我有
Access violation reading location 0xFFFFFFFFFFFFFFFF
在 for 语句中,第 appearanceArrayOfNumThings[currentNumberOfThings ].push_back(arrayOne[i]);
行
我在想这是否是因为我不知道的矢量行为。
你能给我任何线索吗?或者你发现我做错了什么?
首先,你应该使用调试器,你会立即发现错误。
其次,new vector<Thing>[maxNThings]
是一个 糟糕的 想法。 不要那样做。至少使用 std::vector<std::vector<Thing>>
。我认为包含向量的结构向量更清晰。
使用向量的向量,你可以使用 .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
的任何值,它总是会失败。
这段代码是这样说的: (代码试图填充外观数组直到 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]);
}
我有
Access violation reading location 0xFFFFFFFFFFFFFFFF
在 for 语句中,第 appearanceArrayOfNumThings[currentNumberOfThings ].push_back(arrayOne[i]);
我在想这是否是因为我不知道的矢量行为。
你能给我任何线索吗?或者你发现我做错了什么?
首先,你应该使用调试器,你会立即发现错误。
其次,new vector<Thing>[maxNThings]
是一个 糟糕的 想法。 不要那样做。至少使用 std::vector<std::vector<Thing>>
。我认为包含向量的结构向量更清晰。
使用向量的向量,你可以使用 .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
的任何值,它总是会失败。