用C创建矩阵

时间:2017-12-27 19:14:56

标签: c matrix dynamic dynamic-arrays

我正在尝试使用用户介绍的行数和6列来创建动态矩阵。 我只想创建矩阵,以便在需要时获取其值。 我试过这个,但程序到达时崩溃了。

matriz = (int **)malloc(n_lines * 6 * sizeof(int *));
for (i = 0; i < n_lines; ++i)
{
    for (j = 0; j < 6; ++j)
    {
        current_year = starting_year + i;
        if (current_year % 400 == 0)
        {
            february = 29;
            days = 366;
            hours = 8784;
            minutes = 527040;
            seconds = 31622400;
        }
        else
        {
            february = 28;
            days = 365;
            hours = 8760;
            minutes = 525600;
            seconds = 31536000;
        }
        matriz[i][0] = { current_year };
        matriz[i][1] = { february };
        matriz[i][2] = { days };
        matriz[i][3] = { hours };
        matriz[i][4] = { minutes };
        matriz[i][5] = { seconds };
    }
}

1 个答案:

答案 0 :(得分:1)

程序崩溃了,因为你正在访问内存块,好像你没有锯齿状的已分配数组,导致无效的内存访问反过来导致你的程序崩溃。

从我看到的 - 你搞砸了类型。有两种方法可以解决这个问题。

  1. int **matriz;
    matriz = malloc(sizeof *matriz*nlines);
    // error check
    for(size_t i=0; i<nlines; i++){
         matriz[i]= malloc(sizeof *matriz[i] * 6);
         // error check
    }
    
  2. int *matriz = malloc(6*nlines*sizeof *matriz);
    // error check 
    matriz[r*6+c] = ... // accessing r-th row c-th column.
    
  3. 基于案例1,它将是

    matriz[i][j] =  current_year ;
    

    同样在案例-2中

    matriz[i*6+j] = current_year;
    

    通用代码结构将是

        if (current_year % 400 == 0)
        {
            ...
            seconds = 31622400;
        }
        else
        {
            ...
            seconds = 31536000;
        }
        for (j = 0; j < 6; ++j)
        {
            matriz[i][j] = current_year ;
            ...
        }
    

    要解释一下 - 第一种情况是分配锯齿状数组。首先是一个指针数组,然后每个指针都指向一个包含6个元素的数组。

    第二种情况基本上是分配一块内存,其中6*nlines int和matriz指向它的开头。现在,这就是为什么你必须首先为它计算正确的索引才能访问这些元素。