簡體   English   中英

使用C ++中的字符串堆排序代碼獲取分段錯誤

[英]Getting Segmentation Fault with string Heap Sort code in C++

int heapSize = 20; //variable 
int left(int i) {
return (2 * i) + 1;
}

int right(int i) {
return (2 * i) + 2;
}

void heapify(string arr[], int i) {
int l = left(i);
int great=0;
int r = right(i);
if ( ((strcmp(arr[l].c_str(),arr[i].c_str()))>0) && (l < heapSize)) {
great = l;
}
else {
great = i;
}

if ( ((strcmp(arr[r].c_str(),arr[great].c_str()))>0) && (r < heapSize)) {
great = r;
}
if (great != i) {
string temp = arr[i];
arr[i] = arr[great];
arr[great] = temp;
heapify(arr, great); //Getting segment here 
}

}

void BuildMaxHeap(string arr[]) {
for (int i = (heapSize - 1) / 2; i >= 0; i--) {
heapify(arr, i);
}
}

void HeapSort(string arr[]) {
BuildMaxHeap(arr); //
for (int i = heapSize; i > 0; i--) {
string temp = arr[0];
arr[0] = arr[heapSize - 1];
arr[heapSize - 1] = temp;
heapSize = heapSize - 1;
heapify(arr, 0);
}

}

對於大於15(例如20個元素)的heapSize,使用此字符串堆排序代碼獲取分段錯誤。 知道原因嗎?

我在gdb中追溯了它,得到了

#0  0x0038124b in ?? () from /lib/tls/i686/cmov/libc.so.6
#1  0x08048f62 in heapify(std::string*, int) ()
#2  0x08049050 in heapify(std::string*, int) ()
#3  0x080490ae in BuildMaxHeap(std::string*) ()
#4  0x080490d3 in HeapSort(std::string*) ()
#5  0x080494f5 in main ()

那么,heapify函數有什么問題呢?

if s中,在嘗試比較字符串之前,應檢查索引是否在數組的邊界內:

if ( (l < heapSize) && (arr[l] > arr[great]) ) {

它是您的數組索引。 檢查出leftright功能和養活他們的for循環參數。 以奇數“HEAPSIZE”值left終有回報指數越過數組的結尾。 隨着偶數“堆大小”, right會做到這一點。

例如,當'heapSize'== 15時,傳遞給'heapify'的最大值'i'將為7 ((15-1)/ 2) 將其傳遞到“ left”中,您將得到15。對於數組而言太大了,因此在嘗試獲取“ strcmp”的字符串時會嘎吱作響。

也許我做錯了什么,但是無論堆大小如何,我都無法運行您的代碼。

PS。 使用'-g3'標志進行構建,以在gdb中獲得更好的調試符號。 g++ -g3 heap.cc

暫無
暫無

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

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