在C中创建矩阵



i'MAING试图创建一个动态矩阵,并使用用户引入数量的线条和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. 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.
    

并且基于案例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指向了它的开始。现在,这就是为什么您必须首先访问元素为其计算正确的索引。

相关内容

  • 没有找到相关文章

最新更新