【问题标题】:Seg fault on merge sort on strings字符串合并排序的段错误
【发布时间】:2019-03-13 12:02:18
【问题描述】:

调试这段代码已经有一段时间了,但我似乎找不到的问题(可能只是遗漏了一些愚蠢的东西)是我的合并排序函数(适用于整数数组)不适用于数组字符串。

void MergeSort(string *input, int lowBound, int highBound)
{
    int midBound;
    if (lowBound < highBound)
    {
        midBound = (lowBound + highBound) / 2;

        MergeSort(input, lowBound, midBound);
        MergeSort(input, midBound + 1, highBound);

        MergeArrs(input, lowBound, highBound, midBound);
    }
}

void MergeArrs(string *a, int lowBound, int highBound, int midBound)
{
    int i, j, idx; 
    string tmp[highBound - lowBound + 1];
    i = lowBound; //Index for front arr
    idx = 0;
    j = midBound + 1; //Index for back arr

    while (i <= midBound && j <= highBound)
    {
        if (a[i] < a[j])
        {
            tmp[idx] = a[i];
            idx++;
            i++;
        }
        else
        {
            tmp[idx] = a[j];
            idx++;
            j++;
        }
    }

    while (i <= midBound)
    {
        tmp[idx] = a[i];
        idx++;
        i++;
    }

    while (j <= highBound)
    {
        tmp[idx] = a[j];
        idx++;
        j++;
    }

    for (i = lowBound; i <= highBound; i++)
    {
        a[i] = tmp[i - lowBound];
    }
}

如果有人知道段错误来自哪里,任何信息将不胜感激。我的测试数组如下所示:

string arr[6] = {"alpha", "beta", "omega", "zeta", "epsilon", "beach"};

并且是这样调用的:

MergeSort(arr, 0, 6);

【问题讨论】:

  • 不应该 highBound 是顶部 index 而不是大小?
  • 我怀疑访问越界,因为它有点与ints 一起使用,并且停止使用需要正确初始化的真实对象。请测试您的所有数组访问,即someArray[i],它们的索引是否在预期范围内。
  • 在许多其他问题中,string tmp[highBound - lowBound + 1]; 不是有效的 C++。
  • @NeilButterworth 这不一定是个问题。 OP 可能正在使用扩展程序,它本身不是问题。
  • 你试过调试器吗?它可以帮助您自己找到段错误,总体而言,它是一个非常有用的工具。

标签: c++ arrays string sorting mergesort


【解决方案1】:

我不是一个聪明人。通过索引,我的合并排序调用中超过 0 到 5 的程序可以正常工作,因为,呃,这些是最高和最低的索引。

它不会与 int 发生段错误,因为它是 @phlipsy 所说的一组基元。

【讨论】:

    猜你喜欢
    • 2020-01-28
    • 2018-10-18
    • 2012-01-17
    • 2021-12-09
    • 1970-01-01
    • 1970-01-01
    • 2012-11-29
    • 2012-05-01
    • 1970-01-01
    相关资源
    最近更新 更多