首页 > 解决方案 > 动态向量数组中的 C++ 访问冲突读取位置 0xFFFFFFFFFFFFFFFF

问题描述

这段代码是这样说的:(代码试图填充外观数组直到 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]);
    }

我有

访问冲突读取位置 0xFFFFFFFFFFFFFFFF

在 for 语句中,行appearanceArrayOfNumThings[currentNumberOfThings ].push_back(arrayOne[i]);

我在想是否是因为我不知道的矢量行为。

你能给我任何线索或者你看到我做错了什么吗?

标签: c++vectorstdvector

解决方案


首先,您应该使用调试器,您会立即发现错误。

其次,new vector<Thing>[maxNThings]是个主意。不要那样做std::vector<std::vector<Thing>>至少使用。在我看来,包含向量的结构向量更清晰。

使用向量的向量,您可以使用.at()which 会告诉您的错误。


此代码将始终调用未定义的行为。

int maxNThings = arrayOne[0].numberOfThings;

让我们假设这个数字是12

appearanceArrayOfNumThings = new vector<Thing>[maxNThings]; // 12

这将创建一个包含 12 个向量的数组。可索引从011

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]因为它可以从toappearanceArrayOfNumThings索引。你进入UB土地。这是你的错误。011

对于任何值,它总是会失败maxNThings


推荐阅读