簡體   English   中英

我無法找到細分錯誤?

[英]I'm having trouble finding the segmentation fault?

我已經編寫了一個程序來對C ++中的數組執行mergesort。 該程序可以正常編譯,但是當我運行它時,它會顯示“分段錯誤(核心已轉儲)”並退出。 我一直在嘗試調試它,但無濟於事。 我確定我在某個地方濫用了指針(因此出現了段錯誤),但是無法將其放置在何處。 有人可以幫我嗎? 謝謝。

#include<iostream>
#include<queue>
#include<algorithm>
#include<math.h>
using namespace std;

void merge(int a[],int start, int middle, int end)
{
  int i;
  queue<int> buffer1;
  queue<int> buffer2;

  for(i = start; i<=middle; i++)
    buffer1.push(a[i]);

  for(i = middle+1; i<=end; i++)
    buffer2.push(a[i]);

  i = start;

  while((!buffer1.empty()) || (!buffer2.empty()))
    {
      if(buffer1.front() < buffer2.front())
    {
      a[i] = buffer1.front();
      buffer1.pop();
      i++;
    }

      else
    {
      a[i] = buffer2.front();
      buffer2.pop();
      i++;
    }
    }

  while(!buffer1.empty())
    {
      a[i] = buffer1.front();
      buffer1.pop();
      i++;
    }

  while(!buffer2.empty())
    {
      a[i] = buffer2.front();
      buffer2.pop();
      i++;
    }


}

void mergeSort(int a[], int start, int end)
{
  int middle;

  if(start<end)
    {
      middle = (start+end)/2;
      mergeSort(a,start,middle);
      mergeSort(a,middle+1,end);
      merge(a, start, middle, end);
    }

}

int main()
{
  int b[6] = {7,8,0,4,5,1},s = 0, e = 5;

  mergeSort(b,s,e);

  for(int i = 0; i<6; i++)
    cout<<b[i]<<endl;

}

這是調試器輸出的內容-

execve("./q1", ["./q1"], [/* 63 vars */]) = 0
brk(0)                                  = 0x1cde000
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fee90911000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=116033, ...}) = 0
mmap(NULL, 116033, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fee908f4000
close(3)                                = 0
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
open("/usr/lib/x86_64-linux-gnu/libstdc++.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0 \240\10\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=1566568, ...}) = 0
mmap(NULL, 3675328, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fee9036e000
mprotect(0x7fee904e1000, 2093056, PROT_NONE) = 0
mmap(0x7fee906e0000, 49152, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x172000) = 0x7fee906e0000
mmap(0x7fee906ec000, 13504, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fee906ec000
close(3)                                = 0
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
open("/lib/x86_64-linux-gnu/libgcc_s.so.1", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\360*\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=92504, ...}) = 0
mmap(NULL, 2188352, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fee90157000
mprotect(0x7fee9016d000, 2093056, PROT_NONE) = 0
mmap(0x7fee9036c000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x15000) = 0x7fee9036c000
close(3)                                = 0
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0`\v\2\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=1869392, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fee908f3000
mmap(NULL, 3972864, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fee8fd8d000
mprotect(0x7fee8ff4d000, 2097152, PROT_NONE) = 0
mmap(0x7fee9014d000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1c0000) = 0x7fee9014d000
mmap(0x7fee90153000, 16128, PROT_READ|PROT_WRITE, `enter code here`MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fee90153000
close(3)                                = 0
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
open("/lib/x86_64-linux-gnu/libm.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\240U\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=1084840, ...}) = 0
mmap(NULL, 3174760, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fee8fa85000
mprotect(0x7fee8fb8c000, 2093056, PROT_NONE) = 0
mmap(0x7fee8fd8b000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x106000) = 0x7fee8fd8b000
close(3)                                = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fee908f2000
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fee908f0000
arch_prctl(ARCH_SET_FS, 0x7fee908f0740) = 0
mprotect(0x7fee9014d000, 16384, PROT_READ) = 0
mprotect(0x7fee8fd8b000, 4096, PROT_READ) = 0
mprotect(0x7fee9036c000, 4096, PROT_READ) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fee908ef000
mprotect(0x7fee906e0000, 40960, PROT_READ) = 0
mprotect(0x604000, 4096, PROT_READ)     = 0
mprotect(0x7fee90913000, 4096, PROT_READ) = 0
munmap(0x7fee908f4000, 116033)          = 0
brk(0)                                  = 0x1cde000
brk(0x1d10000)                          = 0x1d10000
--- SIGSEGV {si_signo=SIGSEGV, si_code=SEGV_MAPERR, si_addr=0} ---
+++ killed by SIGSEGV (core dumped) +++
Segmentation fault (core dumped)

您的while狀況似乎不對。 只要兩個容器之一不為空,您就在循環,然后在它們上調用front()成員函數。 您可能應該一直循環直到它們都包含元素,即在第21行使用&&代替||

所以這條線

while((!buffer1.empty()) || (!buffer2.empty())) // change to &&

我不確定這是否會破壞代碼的邏輯正確性,但這是段錯誤的原因(它來自第25行)

段錯誤發生在行上: if (buffer1.front() < buffer2.front())

queue通常只是作為dequelist的包裝器實現的,您可以找到更具描述性的警告,以防在queue的方法中調用front ,就像在queue的方法中那樣:

在空容器上調用front是未定義的[1] [2]

如果您在Visual Studio中的“調試”下運行,則當遇到段錯誤時,它將彈出此對話框,您可以單擊“重試”以保留所有狀態進行調試:

在此處輸入圖片說明

您的問題是在這條線上:

while ((!buffer1.empty()) || (!buffer2.empty()))

這意味着while如果 -loop執行buffer1 buffer2非空。 您需要將該條件更改為:

while (!empty(buffer1) && !empty(buffer2))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM