数组越界或错误等于 nullptr?C++

array out of bounds or wrong equals to nullptr? c++

本文关键字:nullptr C++ 越界 错误 数组      更新时间:2023-10-16

我有一个给我带来麻烦的方法。我收到分段错误错误。我通过gdb运行了测试,发现问题出在以下方法购物列表数组包含指向产品类对象的指针。我在这里要做的是添加一个项目,我遍历数组,直到找到 nullptr 或空白空间。数组的大小为 20,最初使用构造函数全部设置为 nullptr。数字 =20阵列在客户订单中的位置。

public:
static const size_t number = 20;
private:
std::array<Product*, number> shoppingList;

我如何在构造函数中初始化它:

CustomerOrder::CustomerOrder()
: shoppingList()
{
}

这就是问题方法。

void CustomerOrder::addItem(Product *p)
{
bool space = false;
int counter=0;
while(space==false || counter < 20 )
{
if(shoppingList[counter] == nullptr )
{
shoppingList[counter] = p;
space == true;
}
counter++;
}

你需要在 while 子句中&&

因为space == false它将是(true || false)如果你做一个&&陈述,你将始终有一个真实的陈述,你希望确保两种情况仍然是正确的,而不是一个或另一个是真的。

while(space==false && counter < 20 )

第一次运行此循环:

while(space==false || counter < 20 )
{
    // ...
}

它将用指针p填充数组。下次运行循环时,它将写入数组末尾p。我认为你想要一个&&而不是一个||运算符。

问题是你的状况:

while(space==false || counter < 20 )

这应该更改为:

while(space==false && counter < 20 )

更好的方法是:

for (size_t i = 0; i < CustomerOrder::number; ++i) {
    if (shoppingList [counter] == nullptr) {
        shoppingList [counter] = p ;
        break ;
    }
}

如果你有#include <algorithm>,那么这可以进一步简化为:

auto iter = std::find (std::begin (shoppingList), std::end (shoppingList), nullptr) ;
if (iter != std::end (shoppingList) {
    *iter = p ;
}