【问题标题】:program crashing while bubble sorting?冒泡排序时程序崩溃?
【发布时间】:2013-01-28 13:10:41
【问题描述】:
            int sortAtt2,compare=0,counter=0;
            string tempTitle;
            for(int t=0; t<MAX_BOOKS; t++)
            {
                for(int i=0; i<MAX_BOOKS; i++)
                {
                    compare=(books[i+1].bookTitle).compare(books[i].bookTitle);
                    if(compare>0)
                    {
                        tempTitle=books[i].bookTitle;
                        books[i].bookTitle=books[i+1].bookTitle;
                        books[i+1].bookTitle=tempTitle;

                    }
                }
            }

这是我的代码,每当我执行这个函数时,程序就会崩溃。知道为什么吗?我在这里比较两个字符串以对它们进行冒泡排序。

【问题讨论】:

  • 它到底是在哪里崩溃的?你应该在调试器中运行程序,它会告诉你崩溃的位置。通常这有助于发现问题。
  • @sth 我刚刚发现它在字符串比较参数处崩溃了。
  • 我不是要打破你的泡沫,但是...

标签: c++ string bubble-sort


【解决方案1】:

越界访问。您正在循环中访问books[i+1],其中i 计数为MAX_BOOKS - 1,即,您正在访问books[MAX_BOOKS] - 在带有MAX_BOOKS 元素的数组末尾之后。

【讨论】:

  • 但同样的参数适用于整数,只是它不适用于字符串:(
  • @JoshuaJones 不管你使用字符串还是整数或其他什么,它仍然是错误的。您只是幸运/不幸地与ints 合作。越界访问是未定义的行为,这意味着它可能会起作用,也可能不起作用,或者会偷走你的卡车并碾过你的邮箱。
  • @JoshuaJones - 主要是因为您不会在 floatint 类型上调用方法。返回的值将是数组之后内存中的任何值。
  • @Aesthete 值得一提的是,这绝不是保证。例如,数组后面的字节可能位于读保护区域,在这种情况下,即使int 数组也会崩溃。
  • @Aesthete: 一般来说,假设内存在这两种情况下都是可写的,尝试对未初始化的std::string 执行操作比未初始化的int: 对字符串执行操作更危险有指向假定为堆分配内存的指针,跟随这些指针几乎肯定会失败。对于 int 而言,一切至少是自包含的。无论哪种方式都是未定义的行为 - 但正是因为这样的事情,“但它适用于ints”逻辑不是一个好的健全性检查。
【解决方案2】:

如果您有 MAX_BOOKS 8 个。

Book books[MAX_BOOKS];

然后你像这样循环。

for(int i=0; i<MAX_BOOKS; i++)
{
  books[i+1];
}

i == 7 时会发生什么?

【讨论】:

  • 但同样的参数适用于整数和浮点数,只是不适用于字符串。
  • 这是因为 floatint 没有 .bookTitle 方法。访问这些类型只会返回数组之后内存中的任何内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-21
  • 1970-01-01
  • 2013-04-01
  • 2011-06-25
  • 1970-01-01
  • 2013-10-09
相关资源
最近更新 更多