C ++ qsort 2D数组

时间:2013-12-09 15:52:58

标签: c++

我仍然收到lldb错误,因为我可能正在访问内存,我不应该。  看起来我在使用io_seg_sort中的参数进行操作时出错了,因为在调用qsort之前,它仍然可以。

    #define IO_SEG_IMAX (IO_SEG - 1)

    static int io_seg_sort (const void * seg1, const void * seg2) {

            int * _seg1 = (int *)seg1;
            int * _seg2 = (int *)seg2;

            cout << _seg1[1] <<endl; // this gives some random values and not what i am expecting

            if (_seg1[1] > _seg2[1]) {
                return 1;
            }
            else if (_seg1[1] < _seg2[1]) {
                return -1;
            }
            else {
                return 0;
            }

        }


            int **temp = new int *[IO_SEG];

            for (int i = 0; i <= IO_SEG_IMAX; i++) {
                temp[i] = new int[2];
                memcpy(temp[i], inputs[i], sizeof(int) * 2);
            }


            qsort(temp, IO_SEG, sizeof(int *) , io_seg_sort);

EDIT1 :问题是我在调用io_seg_sort而不是我期待的cout时获得了一些随机值。 inputs[i]是班级成员int inputs[IO_SEG][2];

2 个答案:

答案 0 :(得分:3)

您将IO_SEG_MAX + 1个项目放入IO_SEG长的数组中。

    for (int i = 0; i <= IO_SEG_IMAX; i++) {
        temp[i] = new int[2];
        memcpy(temp[i], inputs[i], sizeof(int) * 2);
    }

应该是:

    for (int i = 0; i < IO_SEG; i++) {
        temp[i] = new int[2];
        memcpy(temp[i], inputs[i], sizeof(int) * 2);
    }

但如果你真的打算用C ++做这件事,你应该研究std::vectorstd::sort

答案 1 :(得分:1)

您的代码打印垃圾的主要原因是您在比较函数中具有不匹配的间接级别。您传递给temp的{​​{1}}数组由指针组成,包含两个元素数组。这意味着在比较函数中,您实际上会收到指向qsort 指针的指针。即这已经不正确了

int

您必须执行类似

的操作
static int io_seg_sort (const void * seg1, const void * seg2) {

        int * _seg1 = (int *)seg1;
        int * _seg2 = (int *)seg2;

        cout << _seg1[1] <<endl;

通过static int io_seg_sort (const void * seg1, const void * seg2) { const int * _seg1 = *(const int *const *) seg1; const int * _seg2 = *(const int *const *) seg2; _seg1访问您的数组,就像在_seg2正文中一样(我还添加了一些io_seg_sort限定符,尽管它们不是代码工作所必需的。)