C++为什么我的指针选择排序中存在分段错误?
C++ why is there a segmentation fault in my pointer selection sort?
下面是我的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;
}
函数中的一般逻辑方向正确。但是,您似乎在数组元素的值和用于访问数组元素的索引之间感到困惑。
该行
for (int i = *start; i < *stop - 1; ++i)
显示了混乱的最初迹象。
您将使用数组的第一个元素的值初始化
i
,并在循环的后续迭代中递增该值。这是不正确的。递增数组第一个元素的值在逻辑上没有意义。*stop
会导致未定义的行为,因为stop
指向一个超过最后一个有效元素的位置。
您需要使用int* i
、int* j
和int* 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] << " ";
}
相关文章:
- 分段故障(堆芯转储)矢量
- C++模板来检查友元函数的存在
- 数组的指针从不分段故障
- 在某些循环内使用vector.push_back时出现分段错误
- 既然存在危险,为什么项目要使用-I include开关
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 我们可以访问一个不存在的联盟的成员吗
- 在线编译器中的分段C++没有打印消息
- C++为什么我的指针选择排序中存在分段错误?
- 为什么此代码中存在分段错误?
- 来自提升的分段错误(提升:文件系统:存在)
- 哈希表中存在分段错误
- 带有OpenCV的QTCreator存在分段错误
- 使用自动关键字创建的类型的表达式模板中存在分段错误
- 为什么我遇到此代码的分段错误?此代码几乎没有运行,因此构造函数或复制构造函数中可能存在错误
- 没有CUDA代码的线程中存在CUDA分段错误
- 是否可能存在引用中的分段错误
- 代码中存在分段错误
- 数组的数组中存在分段故障
- 有人知道为什么我的代码中存在这种分段错误吗?