【问题标题】:segmentation fault using q sort?使用q排序的分段错误?
【发布时间】:2014-10-09 18:07:26
【问题描述】:

我正在尝试使用 qsort 对字符指针数组进行排序,并在编译时不断出现分段错误。我将发布我的 qsort 调用和比较函数的代码,任何帮助将不胜感激。

//count declaration
size_t count = (sizeof (strPtrsQsort)/sizeof (*strPtrsQsort));
//function call
qsort ((char *)ptr, size, sizeof(char), compare);

//compare function
int compare (const void *a, const void *b)
{
    const char **ia = (const char **)a;
    const char **ib = (const char **)b;
    return strcmp (*ia, *ib);
}

【问题讨论】:

  • 什么是count,什么是strPtrsQsort,它们是否存在于您发布的代码sn-p 中?它们在qsort 的任何地方都没有使用。
  • 为什么在 C++ 中使用 C 字符串、原始数组和 C 的 qsort?使用std::vector<std::string>std::sort
  • 如果你试图对一个指针数组进行排序,为什么数组元素大小被传递给qsortsizeof(char)??? ptr 是如何声明的?为什么在传递给qsort 之前将其转换为char *

标签: c++ qsort


【解决方案1】:

根据您的qsort 调用判断,您正在对char 元素的数组进行排序:基指针类型作为char * 值传递给qsort,元素大小为sizeof(char)。但是,您的比较函数是为char指针 数组编写的。这是完全不正确和不一致的。这就是导致崩溃的原因。

在随附的文本中,您声明您正在“尝试对字符指针数组进行排序”。为什么在这种情况下您将元素大小指定为sizeof(char) 而不是sizeof (char *)

【讨论】:

  • 感谢您的帮助。我对指针很陌生,只是开始取消引用。这帮助很大。
【解决方案2】:

请注意,即使您需要使用 C 风格的原始数组,您仍然可以使用 C++ STL 算法,因为指针实际上是 RandomAccessIterators。例如,这有效:

#include <algorithm>
#include <iostream>
#include <cstring>

static
bool compare(const char *a, const char *b)
{
    return std::strcmp(a, b) < 0;
}

int main()
{
    const char *stringarray[] = {
        "zyxulsusd",
        "abcdef",
        "asdf"
    };

    std::sort(stringarray, stringarray + 3, compare);
    //                      -----------^
    // Just like a normal iterator the end iterator points
    // to an imaginary element behind the data.

    for(int i = 0; i < 3; i++) {
        std::cout << stringarray[i] << std::endl;
    }

    return 0;
}

这种方法的主要优点是类型安全,因此它避免了大多数 C 风格函数常见的陷阱,例如 qsort

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-18
  • 2014-06-04
  • 2016-06-04
  • 2021-04-30
  • 2016-05-28
  • 1970-01-01
  • 2014-03-21
相关资源
最近更新 更多