使用字符串堆获取分段错误使用C ++排序代码

时间:2011-11-27 15:41:51

标签: c++ string sorting segmentation-fault heapsort

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的heapSize的此字符串堆排序代码获取分段错误,例如20个元素。 有什么想法吗?

我在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函数有什么问题?

2 个答案:

答案 0 :(得分:0)

if中,您应该检查索引是否在之前的数据范围内,您尝试比较蜇伤:

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

答案 1 :(得分:0)

这是你的数组索引。查看left&amp; right函数和提供它们的for循环参数。奇数编号的'heapSize'值left最终将返回一个超过数组末尾的索引。使用偶数编号的'heapSize',right将执行此操作。

e.g。 当'heapSize'== 15时,那么传递给'heapify'的最大'i'将是7 ((15-1)/ 2)。将它传递到'left'并且你得到15.对于数组来说太大了,所以当试图获得'strcmp'的字符串时它会呱呱叫。

也许我做错了什么,但是无论堆大小如何,我都没有让你的代码运行。

PS。使用'-g3'标志构建以在gdb中获得更好的调试符号。 g++ -g3 heap.cc