矩阵排序分段故障

时间:2016-02-16 17:22:03

标签: c sorting matrix segmentation-fault

我需要存储一个矩阵o N个学生有4个字段(数字,1年级,2年级和平均数)。这可以通过结构来实现,但这不是本练习的目的。收集数据(read_data)后,必须根据平均值(sort_matrix)对数据进行排序。但是,当插入4个或更多学生时,会发生分段错误。我一直无法检测到问题的根源。我错过了什么? 相关代码如下。

void read_data(float **mtx, int *size){
    float num, grade1, grade2;

    while( scanf("%f %f %f", &num, &grade1, &grade2)==3 ){
        (*size)++;
        mtx = (float**)realloc(mtx, (*size)*sizeof(float*) );
        mtx[*size-1] = (float*)malloc(4*sizeof(float));
        mtx[*size-1][0] = num;
        mtx[*size-1][1] = grade1;
        mtx[*size-1][2] = grade2;
        mtx[*size-1][3] = (grade1+grade2)/2;
    }
    printf("Done reading\n");
}


void sort_matrix(float **mtx, int size){
    int i=0, j=0;
    float *aux = NULL;

    for(i=0; i<size-1; i++){
        for(j = 0; j<size-1-i; j++){
            if(mtx[j][3] > mtx[j+1][3]){
                aux = mtx[j];
                mtx[j] = mtx[j+1];
                mtx[j+1]=aux;
            }
        }
    }
    printf("Done sorting\n");
}

int main(void){
    float **mtx =(float**)malloc(0);
    int size=0;

    read_data(mtx, &size);
    sort_matrix(mtx, size);
    print_matrix(mtx, size);
    return 0;

}

编辑:按照下面给出的答案,我发现this topic被证明是有用的。 结果问题是在没有传递指针地址的情况下改变了mtx的大小。对于排序函数,不需要传递地址,因为即使mtx数组指向的地址将改变,大小也不会。

3 个答案:

答案 0 :(得分:6)

你几乎拥有它。

您已将size的地址传递给read_data,因此可以在该功能中更改size,但传递mtx的地址},所以反映了在read_data内完成的分配。

答案 1 :(得分:1)

如果要在函数中分配矩阵,则需要将指针传递给该矩阵。即你想分配一个float**矩阵,因此你需要将float ***传递给你的函数。

编辑:或者您可以返回矩阵。

答案 2 :(得分:1)

斯科特已经指出你没有将mtx的地址传递给read_data()。你想要一个像这样的解决方案:

void read_data(float ***mtx, int *size){
    float num, grade1, grade2;


    while( scanf("%f %f %f", &num, &grade1, &grade2)==3 ){
        (*size)++;
        (*mtx) = (float**)realloc(*mtx, (*size)*sizeof(float*) );
        (*mtx)[*size-1] = (float*)malloc(4*sizeof(float));
        (*mtx)[*size-1][0] = num;
        (*mtx)[*size-1][1] = grade1;
        (*mtx)[*size-1][2] = grade2;
        (*mtx)[*size-1][3] = (grade1+grade2)/2;
    }
    printf("Done reading\n");
}


void sort_matrix(float ***mtxt, int *sz){
    int i=0, j=0;
    float *aux = NULL;
    int size=*sz;
    float **mtx=*mtxt;

    for(i=0; i<size-1; i++){
        for(j = 0; j<size-1-i; j++){
            if(mtx[j][3] > mtx[j+1][3]){
                aux = mtx[j];
                mtx[j] = mtx[j+1];
                mtx[j+1]=aux;
            }
        }
    }
    printf("Done sorting\n");
}

int main(void){
    float **mtx =(float**)malloc(0);
    int size=0;

    read_data(&mtx, &size);
    printf("Size = %d",size);
    sort_matrix(&mtx, &size);
    print_matrix(&mtx, size);
    return 0;

}