【问题标题】:Matrix sorting segmentation fault矩阵排序分段错误
【发布时间】:2016-05-28 02:44:57
【问题描述】:

我需要存储一个包含 4 个字段(数字、等级 1、等级 2 和平均)的 N 个学生的矩阵。这可以通过结构来实现,但这不是本练习的目的。一旦收集到数据(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 数组指向的地址会改变,但大小不会。

【问题讨论】:

标签: c sorting matrix segmentation-fault


【解决方案1】:

你几乎拥有它。

您将size 的地址传递给read_data,因此size 可以在该函数中更改,但是没有 传递mtx 的地址,所以它确实反映在read_data内完成的分配。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      正如斯科特指出的那样,您没有将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;
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-05
        相关资源
        最近更新 更多