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

C 带指向字段分段错误指针的Qsort,c,C,我想根据0列pnt[I][0]对类型为(*double)[3]的指针进行排序。比如说 4 3 4 2 1 2 9 4 5 我想要 2 1 2 4 3 4 9 4 5 我调用了快速排序函数 qsort (pnt, numOfRows, sizeof(double), forQs); 以下是FORQ int forQs (const void *x, const void *y) { const double **k = (const double **)x; const d

我想根据
0
pnt[I][0]
对类型为
(*double)[3]
的指针进行排序。比如说

4 3 4
2 1 2
9 4 5
我想要

2 1 2
4 3 4
9 4 5
我调用了快速排序函数

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;
}
#包括
#包括
#包括
整数forQs(常数无效*x,常数无效*y)
{
常数双**k=(常数双**)x;
常数双**l=(常数双**)y;
返回(*k)[0]-(*l)[0];
}
int main(){
双**pnt=malloc(100*sizeof(双(*)[3]);
int i,j;

对于(i=0;iProtip:
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 */

通过这种方式,您可以自动获得正确的代码,而无需考虑数组如何以及何时成为指针(提示:它们不是)。

请显示
pnt
numorrows
forQs
的声明。通过显示,我的意思是请编辑问题以包括这些。pnt=(double(*)[2])malloc 100*sizeof(*pnt)),在分配时,每读取一行的行数都在增加(所以在它转到qsort时已经设置好了),forQs在问题中抱歉,这只是一个输入错误。我这里有pnt=(double(*)[3])malloc(100*sizeof(*pnt)),所以这不是问题。不要在注释中发布修复。改为编辑您的帖子。注释中的代码不可读。
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 */