【问题标题】:Why am I getting a segmentation fault error on my merge sort program [closed]为什么我的合并排序程序出现分段错误错误[关闭]
【发布时间】: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


【解决方案1】:

您的向量的大小为零。改变

vector<int> mergedNumbers; 

vector<int> mergedNumbers(mergedSize); 

或者在向向量中添加项目时使用push_back

就像数组一样,向量不会自动调整大小。如果要更改向量的大小,则必须使用 push_backresize 之类的方法。

您的代码还有另一个问题。您正在按值传递向量,这意味着您正在对向量的副本进行排序,main 中的原始向量将保持不变。请改用参考。

void Merge(vector<int>& numbers, int i, int j, int k) {

void MergeSort(vector<int>& numbers, int i, int k) {

编辑

还有两个看起来像是拼写错误的错误

 if (numbers[leftPos] < numbers[rightPos]) {
     mergedNumbers[mergePos] = numbers[leftPos];
     ++i;
  }
  else {
     mergedNumbers[mergePos] = numbers[rightPos];
     rightPos;
     
  }

应该是

 if (numbers[leftPos] < numbers[rightPos]) {
     mergedNumbers[mergePos] = numbers[leftPos];
     ++leftPos;                // <-- here
  }
  else {
     mergedNumbers[mergePos] = numbers[rightPos];
     ++rightPos;               // <-- here  
  }

【讨论】:

  • 我这样做了,但分段错误仍然存​​在。
猜你喜欢
  • 1970-01-01
  • 2021-03-30
  • 2018-10-18
  • 1970-01-01
  • 1970-01-01
  • 2021-10-14
  • 1970-01-01
  • 2020-05-25
  • 2021-07-18
相关资源
最近更新 更多