繁体   English   中英

Qsort带有指向字段分段错误的指针

[英]Qsort with pointer to field segmentation fault

我想根据0pnt[i][0]对类型(*double)[3]指针进行排序。 因此,例如

4 3 4
2 1 2
9 4 5

我想要

2 1 2
4 3 4
9 4 5

我打电话给quicksort功能

qsort (pnt, numOfRows, sizeof(double), forQs);

与forQ如下

int forQs (const void *x, const void *y)
{
    const double **k = (const double **)x; 
    const double **l = (const double **)y;
    return (*k)[0] - (*l)[0];
}

我最终遇到了分割错误,并且valgrind说这是因为forQs。 我对qsort不太了解,因此我已经在探索很多方法了,但是我看不出有任何错误。 有人可以帮忙吗?

编辑:我也用过:

pnt = (double (*)[3]) malloc(100 * sizeof(*pnt));

我试图做两个样本,因为您还不够好未知。 请参考。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int forQs (const void *x, const void *y)
{
    const double **k = (const double **)x; 
    const double **l = (const double **)y;
    return (*k)[0] - (*l)[0];
}

int main(){
    double **pnt = malloc(100*sizeof(double(*)[3]));
    int i, j;

    for(i=0;i<3;++i)
        pnt[i] = malloc(sizeof(double[3]));

    memcpy(pnt[0], (double [3]){4.0, 3.0, 4.0}, sizeof(double[3]));
    memcpy(pnt[1], (double [3]){2.0, 1.0, 2.0}, sizeof(double[3]));
    memcpy(pnt[2], (double [3]){9.0, 4.0, 5.0}, sizeof(double[3]));

    {//print before sort
        int i,j;
        for(i=0;i<3;++i){
            for(j=0;j<3;++j)
                printf("%g ", pnt[i][j]);
            printf("\n");
        }
        printf("\n");

    }
    int numOfRows = 3;
//  qsort(pnt, numOfRows, sizeof(double*), forQs);
    qsort(pnt, numOfRows, sizeof(*pnt), forQs);
    {//print after sort
        int i,j;
        for(i=0;i<3;++i){
            for(j=0;j<3;++j)
                printf("%g ", pnt[i][j]);
            printf("\n");
        }

    }
    return 0;
}

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int forQs (const void *x, const void *y)
{
    const double (*k)[3] = *(const double (**)[3])x; 
    const double (*l)[3] = *(const double (**)[3])y;
    return (*k)[0] - (*l)[0];
}

int main(){
    double (**pnt)[3] = malloc(100*sizeof(*pnt));
    int i, j;

    for(i=0;i<3;++i)
        pnt[i] = malloc(sizeof(double[3]));

    memcpy(pnt[0], (double [3]){4.0, 3.0, 4.0}, sizeof(double[3]));
    memcpy(pnt[1], (double [3]){2.0, 1.0, 2.0}, sizeof(double[3]));
    memcpy(pnt[2], (double [3]){9.0, 4.0, 5.0}, sizeof(double[3]));

    {//print before sort
        int i,j;
        for(i=0;i<3;++i){
            for(j=0;j<3;++j)
                printf("%g ", (*(pnt[i]))[j]);
            printf("\n");
        }
        printf("\n");

    }
    int numOfRows = 3;
    //qsort(pnt, numOfRows, sizeof(double(*)[3]), forQs);
    qsort(pnt, numOfRows, sizeof(*pnt), forQs);

    {//print after sort
        int i,j;
        for(i=0;i<3;++i){
            for(j=0;j<3;++j)
                printf("%g ", (*(pnt[i]))[j]);
            printf("\n");
        }

    }
    return 0;
}

提示: typedef您要使用的东西,并始终坚持下去。

想要3双的向量吗?

typedef double vec3[3];

现在,当您根据vec3重写代码时,问题显而易见。

qsort (pnt, numOfRows, sizeof(double), forQs); /* was */
qsort (pnt, numOfRows, sizeof(vec3), forQs); /* now */

const double **k = (const double **)x; /* was */
const vec3* k = (const vec3*)x; /* now */

这样,您可以自动获取正确的代码,而不必考虑数组如何以及何时成为指针(提示:它们没有)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM