【问题标题】:C++ why is there a segmentation fault in my pointer selection sort?C++ 为什么在我的指针选择排序中有分段错误?
【发布时间】:2019-03-08 06:30:17
【问题描述】:

下面是我的 C++ 代码。我正在尝试使用指针(开始和结束)实现选择排序。代码可以编译,但在对随机生成的列表进行排序之前出现分段错误(目前只打印随机数)。

任何关于为什么会这样以及如何解决它的帮助将不胜感激。

#include<stdio.h>
#include<stdlib.h>
#include <iostream>

using namespace std;

void selectionSort(int *start, int *stop) {
   for (int i = *start; i < *stop - 1; ++i) {
     int min = i;
       for (int j = i + 1; j < *stop; ++j) {
         if ((&start[0])[j] < (&start[0])[min])
            min = j;
         }
     swap((&start[0])[i], (&start[0])[min]);
   }
}


int main()
{
  int size = 10;
    int* data = new int[size];
    for (int i = 0; i < size; ++i)
   {
      data[i] = rand() % size;
    }
    for (int k = 0; k < size; k++)
    {
      cout << data[k] << " ";
    }
    cout << endl;
    selectionSort(data, data+size);
    for (int j = 0; j < size; j++)
    {
      cout << data[j+1] << " ";
    }
    return 0;
}

【问题讨论】:

  • 小心标记的方式。您的代码示例显然不是 C,以至于您会惹恼 C 标签所吸引的一些 C 程序员。
  • jsize-1j+1 是什么?
  • 这里需要使用指针吗? C++ 的引用应该能够轻松地处理您正在做的事情。
  • for (int i = *start; 不,这不是您遍历数组的方式。编写一个单独的min 函数,调试并测试它。然后在你的sort中使用一个
  • swap((&amp;start[0])[i], (&amp;start[0])[min]); 措辞很奇怪。 &amp;start[0]start 是一样的,所以你可以写(大多数人都希望读)swap(start[i], start[min]);

标签: c++ sorting pointers selection-sort


【解决方案1】:

您的函数中的一般逻辑是正确的方向。但是,您似乎对数组元素的值和用于访问数组元素的索引感到困惑。

线

for (int i = *start; i < *stop - 1; ++i)

显示出混乱的最初迹象。

  1. 您正在使用数组的第一个元素的值初始化i,并在循环的后续迭代中递增该值。这是不正确的。增加数组第一个元素的值没有逻辑意义。

  2. *stop 导致未定义的行为,因为stop 指向最后一个有效元素之后的位置。

您需要使用int* iint* jint* min 对元素进行正确排序。这也意味着相应地更新几乎整个功能。这是一个对我有用的更新函数。

void selectionSort(int *start, int *stop) {
   for (int* i = start; i < (stop - 1); ++i) {
      int* min = i;
      for (int* j = i + 1; j < stop; ++j) {
         if (*j < *min)
         {
            min = j;
         }
      }
      swap(*i, *min);
   }
}

另外,main 中的以下行不正确。您最终会使用越界索引访问数组。

for (int j = 0; j < size; j++)
{
   cout << data[j+1] << " ";
}

替换为

for (int k = 0; k < size; k++)
{
   cout << data[k] << " ";
}

【讨论】:

  • 这是一个很好的答案,当指针是一个新概念时,急于取消引用,回到熟悉的领域,是可以理解的,但这种心态会导致不必要的级联问题。细读 STL &lt;algorithm&gt; 接口将使 OP 受益。
猜你喜欢
  • 2018-01-03
  • 2021-03-30
  • 2017-09-24
  • 2016-11-04
  • 1970-01-01
  • 2012-04-10
  • 2013-09-18
  • 2016-02-24
  • 1970-01-01
相关资源
最近更新 更多