【发布时间】:2021-01-11 22:51:41
【问题描述】:
在我决定将数组更改为向量之前,我的程序一直正常工作,现在它不断产生分段错误,而不是输出排序后的向量,我不知道为什么。
#include <iostream>
#include <vector>
using namespace std;
void Merge(vector<int> numbers, int i, int j, int k) {
int mergedSize;
int mergePos;
int leftPos;
int rightPos;
mergePos = 0;
mergedSize = k - i + 1;
leftPos = i;
rightPos = j + 1;
vector<int> mergedNumbers;
while (leftPos <= j && rightPos <= k) {
if (numbers[leftPos] < numbers[rightPos]) {
mergedNumbers[mergePos] = numbers[leftPos];
++i;
}
else {
mergedNumbers[mergePos] = numbers[rightPos];
rightPos;
}
++mergePos;
}
while (leftPos <= j) {
mergedNumbers[mergePos] = numbers[leftPos];
++leftPos;
++mergePos;
}
while (rightPos <= k) {
mergedNumbers[mergePos] = numbers[rightPos];
++rightPos;
++mergePos;
}
for (mergePos = 0; mergePos < mergedSize; ++mergePos) {
numbers[i + mergePos] = mergedNumbers[mergePos];
}
}
void MergeSort(vector<int> numbers, int i, int k) {
int j;
if (i < k) {
j = (i + k) / 2;
MergeSort(numbers, i, j);
MergeSort(numbers, j + 1, k);
Merge(numbers, i, j, k);
}
}
int main() {
vector<int> numbers;
numbers.push_back(10);
numbers.push_back(2);
numbers.push_back(78);
numbers.push_back(4);
numbers.push_back(45);
numbers.push_back(32);
numbers.push_back(7);
numbers.push_back(11);
const int NUMBERS_SIZE = 8;
int i;
cout << "UNSORTED: ";
for(i = 0; i < NUMBERS_SIZE; ++i) {
cout << numbers[i] << " ";
}
cout << endl;
MergeSort(numbers, 0, NUMBERS_SIZE - 1);
cout << "SORTED: ";
for(i = 0; i < NUMBERS_SIZE; ++i) {
cout << numbers[i] << " ";
}
cout << endl;
return 0;
}
我是编程新手,这很可能是我的一个愚蠢错误,但我很想了解为什么会发生这种情况。
【问题讨论】:
-
在分配给它之前,您永远不会调整
mergedNumbers的大小。所以像mergedNumbers[mergePos] =这样的东西会写越界 -
如果出现分段错误,您可以在调试器中停止(或在 *NIX 上加载核心文件)。然后你就会确切地知道它发生时发生了什么。这可能让您自己找出问题所在,如果没有,您将有一些信息可以添加到您的问题中。当你本可以告诉我们的时候,我为什么要阅读你所有的代码来猜测它崩溃的地方?
-
我以“错字”的身份投票结束
标签: c++ arrays vector segmentation-fault