【问题标题】:array out of bounds or wrong equals to nullptr? c++数组越界或错误等于 nullptr? C++
【发布时间】:2014-03-28 11:45:31
【问题描述】:

我有一个给我带来麻烦的方法。我收到分段错误错误。我通过 gdb 进行了测试,发现问题出在以下方法 shoppingList 数组包含指向 Product 类对象的指针。 我在这里要做的是添加一个项目,我遍历数组,直到找到一个 nullptr 或空白空间。数组的大小为 20,最初使用构造函数将其全部设置为 nullptr。 数量=20 数组在 CustomerOrder.h 中的样子

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++;
}

【问题讨论】:

  • space == true 没有将 true 分配给空间。它只是比较它。你的意思可能是space = true
  • 我认为大多数编译器都会对space == true; 发出警告。是否启用了警告?
  • 除了答案和 Rosme 所说的之外,您可以通过将条件更改为 while(counter &lt; 20) 而不是 space = true; 来使循环变得更简单(在我看来),而不是 break .这样你就不需要 space 变量了。

标签: c++ arrays error-handling


【解决方案1】:

您需要在 while 子句中使用 &amp;&amp;

因为space == false 将是 (true || false),如果您执行 && 声明,您将始终拥有一个真实的声明,您希望确保这两种情况仍然是真实的,而其中一种情况是真实的。

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

【讨论】:

    【解决方案2】:

    此循环第一次运行:

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

    它将用指针p 填充数组。下次您运行循环时,它将在数组末尾写入p。我认为您需要 &amp;&amp; 而不是 || 运算符。

    【讨论】:

      【解决方案3】:

      问题是你的情况:

      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 &lt;algorithm&gt;,那么这可以进一步简化为:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-04-02
        • 1970-01-01
        • 1970-01-01
        • 2014-11-30
        • 1970-01-01
        • 2019-05-03
        • 2017-09-28
        • 2015-01-10
        相关资源
        最近更新 更多